【进程/作业管理】篇章一:Linux进程及管理(专用内存监控类工具)------【vmstat、pmap】

时间:2022-04-01 03:41:33

主要讲解专用内存监控工具的使用:vmstat、pmap命令的使用。



命令概览:

vmstat 显示虚拟内存状态
pmap 报告进程与内存映射关系

    vmstat命令是最常见的Linux/Unix监控工具,可以展现给定时间间隔的服务器的状态值,包括服务器的CPU使用率,内存使用,虚拟内存交换情况,IO读写情况。这个命令是我查看Linux/Unix最喜爱的命令,一个是Linux/Unix都支持,二是相比top,我可以看到整个机器的CPU,内存,IO的使用情况,而不是单单看到各个进程的CPU使用率和内存使用率(使用场景不一样)。

    pmap命令用于报告进程的内存映射关系,是Linux调试及运维一个很好的工具



 

vmstat命令详解:

  命令格式:vmstat  [options]  [delay [count]]

用法:
vmstat [-a] [-n] [-t] [-S unit] [delay [ count]] vmstat [-s] [-n] [-S unit] vmstat [-m] [-n] [delay [ count]] vmstat [-d] [-n] [delay [ count]] vmstat [-p disk partition] [-n] [delay [ count]] vmstat [-f] vmstat [-V]
上面各选项的用法:
-a:显示活跃和非活跃内存 -f:显示从系统启动至今的fork数量 。 -m:显示slabinfo -n:只在开始时显示一次各字段名称。 -s:显示内存相关统计信息及多种系统活动数量。 delay:刷新时间间隔。如果不指定,只显示一条结果。 count:刷新次数。如果不指定刷新次数,但指定了刷新时间间隔,这时刷新次数为无穷。 -d:显示磁盘相关统计信息。 -p:显示指定磁盘分区统计信息 -S:使用指定单位显示。参数有 k 、K 、m 、M ,分别代表1000、10241000000、1048576字节(byte)。默认单位为K(1024 bytes) -V:显示vmstat版本信息。

【进程/作业管理】篇章一:Linux进程及管理(专用内存监控类工具)------【vmstat、pmap】

上图信息说明:

procs(进程):
  r:等待运行的进程的个数;CPU上等待运行的任务的队列长度;(单核心如果大于4个的话,代表CPU老式了),【运行队列中进程数量,这个值也可以判断是否需要增加CPU。(长期大于1)】
  b:处于不可中断睡眠态的进程个数;被阻塞的任务队列的长度;【 等待IO的进程数量】
memory(内存):
  swpd:交换内存使用总量;【使用虚拟内存大小,如果swpd的值不为0,但是SI,SO的值长期为0,这种情况不会影响系统性能】
  free:空闲的物理内存总量;
  buffer:用于buffer的内存总量;
  cache:用于cache的内存总量;【如果cache的值大的时候,说明cache处的文件数多,如果频繁访问到的文件都能被cache处,那么磁盘的读IO bi会非常小】
swap(交换分区):
  si:数据进入swap中的数据速率(kb/s)
  so:数据离开swap的速率(kb/s)
io
  bi:从块设备读入数据到系统(内存)的速度(kb/s)
  bo:保存数据至块设备的速率(kb/s)
  【注意:随机磁盘读写的时候,这2个值越大(如超出1024k),能看到CPU在IO等待的值也会越大】 system
in:interrupts,中断速率; cs:context switch, 上下文(进程)切换的速率;
  【注意:上面2个值越大,会看到由内核消耗的CPU时间会越大】 cpu(以百分比表示) us: user space 【用户进程执行时间百分比(user time) us的值比较高时,说明用户进程消耗的CPU时间多,但是如果长期超50%的使用,那么我们就该考虑优化程序算法或者进行加速】 sy:system space 【内核系统进程执行时间百分比(system time) sy的值高时,说明系统内核消耗的CPU资源多,这并不是良性表现,我们应该检查原因】 id:idle     【空闲时间百分比】 wa:wait     
【 IO等待时间百分比 wa的值高时,说明IO等待比较严重,这可能由于磁盘大量作随机访问造成,也有可能磁盘出现瓶颈(块操作)】
st: stolen 被虚拟化技术偷走的时间比例

具体不懂的参数,也可以参考博文:http://www.cnblogs.com/ggjucheng/archive/2012/01/05/2312625.html

 



 

示例1:# vmstat 

[root@test1 ~]# vmstat
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 0  0      0 548328  68992 225356    0    0     2     4   14   26  0  0 99  0  0

 

示例2:显示活跃和非活跃内存,显示增加了inact和active列

  # vmstat –a 

[root@test1 ~]# vmstat -a
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
 r  b   swpd   free  inact active   si   so    bi    bo   in   cs us sy id wa st
 1  0      0 544568 136496 181052    0    0     2     4   14   26  0  0 99  0  0    

 

示例3:查看内存使用的详细信息

  # vmstat -s 

[root@test1 ~]# vmstat -s
      1004768  total memory
       460324  used memory
       181108  active memory
       136524  inactive memory
       544444  free memory
        69112  buffer memory
       225364  swap cache
       694268  total swap
            0  used swap
       694268  free swap
         7676 non-nice user cpu ticks
          159 nice user cpu ticks
        20991 system cpu ticks
      8890162 idle cpu ticks
        13503 IO-wait cpu ticks
          151 IRQ cpu ticks
         6833 softirq cpu ticks
            0 stolen cpu ticks
       212693 pages paged in
       397093 pages paged out
            0 pages swapped in
            0 pages swapped out
      1246321 interrupts
      2315434 CPU context switches
   1528692781 boot time
        12891 forks

 

示例4:查看磁盘的读/写

  # vmstat -d

[root@test1 ~]# vmstat -d
disk- ------------reads------------ ------------writes----------- -----IO------
       total merged sectors      ms  total merged sectors      ms    cur    sec
ram0       0      0       0       0      0      0       0       0      0      0
ram1       0      0       0       0      0      0       0       0      0      0
ram2       0      0       0       0      0      0       0       0      0      0
ram3       0      0       0       0      0      0       0       0      0      0
ram4       0      0       0       0      0      0       0       0      0      0
ram5       0      0       0       0      0      0       0       0      0      0
ram6       0      0       0       0      0      0       0       0      0      0
ram7       0      0       0       0      0      0       0       0      0      0
ram8       0      0       0       0      0      0       0       0      0      0
ram9       0      0       0       0      0      0       0       0      0      0
ram10      0      0       0       0      0      0       0       0      0      0
ram11      0      0       0       0      0      0       0       0      0      0
ram12      0      0       0       0      0      0       0       0      0      0
ram13      0      0       0       0      0      0       0       0      0      0
ram14      0      0       0       0      0      0       0       0      0      0
ram15      0      0       0       0      0      0       0       0      0      0
loop0      0      0       0       0      0      0       0       0      0      0
loop1      0      0       0       0      0      0       0       0      0      0
loop2      0      0       0       0      0      0       0       0      0      0
loop3      0      0       0       0      0      0       0       0      0      0
loop4      0      0       0       0      0      0       0       0      0      0
loop5      0      0       0       0      0      0       0       0      0      0
loop6      0      0       0       0      0      0       0       0      0      0
loop7      0      0       0       0      0      0       0       0      0      0
disk- ------------reads------------ ------------writes----------- -----IO------
       total merged sectors      ms  total merged sectors      ms    cur    sec
sr0      292    617    3900    1519      0      0       0       0      0      1
sda    10899   3670  418286   60106  34022  65242  794234  459408      0    253

示例5:查看 /dev/sda1磁盘的读/写

  # vmstat -p /dev/sda1

[root@test1 ~]# vmstat -p /dev/sda1
sda1          reads   read sectors  writes    requested writes
                 585       4612          3         18

示例6:没两秒采集一次服务器状态,只采集一次

  # vmstat 2 1

[root@test1 ~]# vmstat 2 1  【每2s采集一次数据,只采集1次】
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 1  0      0 548220  69208 225372    0    0     2     4   14   26  0  0 99  0  0    
[root@test1 ~]# vmstat 2 2  【每2s采集一次数据,采集2次】
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 1  0      0 548188  69208 225372    0    0     2     4   14   26  0  0 99  0  0    
 0  0      0 548172  69208 225372    0    0     0     0   13   14  0  0 100  0  0    
[root@test1 ~]# vmstat 2 3  【每2s采集一次数据,采集3次】
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 0  0      0 548220  69208 225372    0    0     2     4   14   26  0  0 99  0  0    
 0  0      0 548172  69208 225372    0    0     0     0   13   13  0  0 100  0  0    
 0  0      0 548172  69208 225372    0    0     0     0   12   11  0  0 100  0  0

示例7:每2s采集一次服务器

  # vmstat 2   【不说明采集次数的话,系统会一直采集着】





 

pmap命令详解

  作用: <--- 用于报告进程的内存映射关系 --->

内存与进程之间的关系也可以通过文件来查看:/proc/PID/maps  【PID指进程的PID】

语法格式:
pmap [ -x | -d ] [ -q ] pids... pmap -V
参数说明:
 -x   extended       Show the extended format. 显示扩展格式
 -d   device         Show the device format.   显示设备格式
 -q   quiet          Do not display some header/footer lines. 不显示头尾行
 -V   show version   Displays version of program. 显示版本
pids 进程的PID号

 

扩展格式和设备格式域:
        Address:  start address of map  映像起始地址
        Kbytes:  size of map in kilobytes  映像大小
        RSS:  resident set size in kilobytes  驻留集大小
        Dirty:  dirty pages (both shared and private) in kilobytes  脏页大小
        Mode:  permissions on map 映像权限: r=read, w=write, x=execute, s=shared, p=private (copy on write)  
        Mapping:  file backing the map , or '[ anon ]' for allocated memory, or '[ stack ]' for the program stack.  映像支持文件,[anon]为已分配内存 [stack]为程序堆栈
        Offset:  offset into the file  文件偏移
        Device:  device name (major:minor)  设备名

示例1:查看设备1的设备格式

  # pmap -d 1

root@test1 ~]# pmap -d 1
1:   /sbin/init
Address           Kbytes Mode  Offset           Device    Mapping
00007f6e5cb24000      48 r-x-- 0000000000000000 008:00003 libnss_files-2.12.so
00007f6e5cb30000    2048 ----- 000000000000c000 008:00003 libnss_files-2.12.so
00007f6e5cd30000       4 r---- 000000000000c000 008:00003 libnss_files-2.12.so
00007f6e5cd31000       4 rw--- 000000000000d000 008:00003 libnss_files-2.12.so
00007f6e5cd32000    1576 r-x-- 0000000000000000 008:00003 libc-2.12.so
00007f6e5cebc000    2048 ----- 000000000018a000 008:00003 libc-2.12.so
00007f6e5d0bc000      16 r---- 000000000018a000 008:00003 libc-2.12.so
00007f6e5d0c0000       4 rw--- 000000000018e000 008:00003 libc-2.12.so
00007f6e5d0c1000      20 rw--- 0000000000000000 000:00000   [ anon ]
00007f6e5d0c6000      88 r-x-- 0000000000000000 008:00003 libgcc_s-4.4.7-20120601.so.1
00007f6e5d0dc000    2044 ----- 0000000000016000 008:00003 libgcc_s-4.4.7-20120601.so.1
00007f6e5d2db000       4 rw--- 0000000000015000 008:00003 libgcc_s-4.4.7-20120601.so.1
00007f6e5d2dc000      28 r-x-- 0000000000000000 008:00003 librt-2.12.so
00007f6e5d2e3000    2044 ----- 0000000000007000 008:00003 librt-2.12.so
00007f6e5d4e2000       4 r---- 0000000000006000 008:00003 librt-2.12.so
00007f6e5d4e3000       4 rw--- 0000000000007000 008:00003 librt-2.12.so
00007f6e5d4e4000      92 r-x-- 0000000000000000 008:00003 libpthread-2.12.so
00007f6e5d4fb000    2048 ----- 0000000000017000 008:00003 libpthread-2.12.so
00007f6e5d6fb000       4 r---- 0000000000017000 008:00003 libpthread-2.12.so
00007f6e5d6fc000       4 rw--- 0000000000018000 008:00003 libpthread-2.12.so
00007f6e5d6fd000      16 rw--- 0000000000000000 000:00000   [ anon ]
00007f6e5d701000     256 r-x-- 0000000000000000 008:00003 libdbus-1.so.3.4.0
00007f6e5d741000    2044 ----- 0000000000040000 008:00003 libdbus-1.so.3.4.0
00007f6e5d940000       4 r---- 000000000003f000 008:00003 libdbus-1.so.3.4.0
00007f6e5d941000       4 rw--- 0000000000040000 008:00003 libdbus-1.so.3.4.0
00007f6e5d942000      36 r-x-- 0000000000000000 008:00003 libnih-dbus.so.1.0.0
00007f6e5d94b000    2044 ----- 0000000000009000 008:00003 libnih-dbus.so.1.0.0
00007f6e5db4a000       4 r---- 0000000000008000 008:00003 libnih-dbus.so.1.0.0
00007f6e5db4b000       4 rw--- 0000000000009000 008:00003 libnih-dbus.so.1.0.0
00007f6e5db4c000      96 r-x-- 0000000000000000 008:00003 libnih.so.1.0.0
00007f6e5db64000    2044 ----- 0000000000018000 008:00003 libnih.so.1.0.0
00007f6e5dd63000       4 r---- 0000000000017000 008:00003 libnih.so.1.0.0
00007f6e5dd64000       4 rw--- 0000000000018000 008:00003 libnih.so.1.0.0
00007f6e5dd65000     128 r-x-- 0000000000000000 008:00003 ld-2.12.so
00007f6e5df75000      20 rw--- 0000000000000000 000:00000   [ anon ]
00007f6e5df83000       4 rw--- 0000000000000000 000:00000   [ anon ]
00007f6e5df84000       4 r---- 000000000001f000 008:00003 ld-2.12.so
00007f6e5df85000       4 rw--- 0000000000020000 008:00003 ld-2.12.so
00007f6e5df86000       4 rw--- 0000000000000000 000:00000   [ anon ]
00007f6e5df87000     140 r-x-- 0000000000000000 008:00003 init
00007f6e5e1a9000       8 r---- 0000000000022000 008:00003 init
00007f6e5e1ab000       4 rw--- 0000000000024000 008:00003 init
00007f6e5ed77000     264 rw--- 0000000000000000 000:00000   [ anon ]
00007fffefae8000      84 rw--- 0000000000000000 000:00000   [ stack ]
00007fffefbe5000       4 r-x-- 0000000000000000 000:00000   [ anon ]
ffffffffff600000       4 r-x-- 0000000000000000 000:00000   [ anon ]
mapped: 19364K    writeable/private: 452K    shared: 0K

最后一行的值
  mapped 表示该进程映射的虚拟地址空间大小,也就是该进程预先分配的虚拟内存大小,即ps出的vsz
  writeable/private  表示进程所占用的私有地址空间大小,也就是该进程实际使用的内存大小      
  shared 表示进程和其他进程共享的内存大小

 

示例2:查看进程1的设备格式,不显示头尾行

  # pmap -dp 1

【进程/作业管理】篇章一:Linux进程及管理(专用内存监控类工具)------【vmstat、pmap】【进程/作业管理】篇章一:Linux进程及管理(专用内存监控类工具)------【vmstat、pmap】
[root@test1 ~]# pmap -dq 1
1:   /sbin/init
00007f6e5cb24000      48 r-x-- 0000000000000000 008:00003 libnss_files-2.12.so
00007f6e5cb30000    2048 ----- 000000000000c000 008:00003 libnss_files-2.12.so
00007f6e5cd30000       4 r---- 000000000000c000 008:00003 libnss_files-2.12.so
00007f6e5cd31000       4 rw--- 000000000000d000 008:00003 libnss_files-2.12.so
00007f6e5cd32000    1576 r-x-- 0000000000000000 008:00003 libc-2.12.so
00007f6e5cebc000    2048 ----- 000000000018a000 008:00003 libc-2.12.so
00007f6e5d0bc000      16 r---- 000000000018a000 008:00003 libc-2.12.so
00007f6e5d0c0000       4 rw--- 000000000018e000 008:00003 libc-2.12.so
00007f6e5d0c1000      20 rw--- 0000000000000000 000:00000   [ anon ]
00007f6e5d0c6000      88 r-x-- 0000000000000000 008:00003 libgcc_s-4.4.7-20120601.so.1
00007f6e5d0dc000    2044 ----- 0000000000016000 008:00003 libgcc_s-4.4.7-20120601.so.1
00007f6e5d2db000       4 rw--- 0000000000015000 008:00003 libgcc_s-4.4.7-20120601.so.1
00007f6e5d2dc000      28 r-x-- 0000000000000000 008:00003 librt-2.12.so
00007f6e5d2e3000    2044 ----- 0000000000007000 008:00003 librt-2.12.so
00007f6e5d4e2000       4 r---- 0000000000006000 008:00003 librt-2.12.so
00007f6e5d4e3000       4 rw--- 0000000000007000 008:00003 librt-2.12.so
00007f6e5d4e4000      92 r-x-- 0000000000000000 008:00003 libpthread-2.12.so
00007f6e5d4fb000    2048 ----- 0000000000017000 008:00003 libpthread-2.12.so
00007f6e5d6fb000       4 r---- 0000000000017000 008:00003 libpthread-2.12.so
00007f6e5d6fc000       4 rw--- 0000000000018000 008:00003 libpthread-2.12.so
00007f6e5d6fd000      16 rw--- 0000000000000000 000:00000   [ anon ]
00007f6e5d701000     256 r-x-- 0000000000000000 008:00003 libdbus-1.so.3.4.0
00007f6e5d741000    2044 ----- 0000000000040000 008:00003 libdbus-1.so.3.4.0
00007f6e5d940000       4 r---- 000000000003f000 008:00003 libdbus-1.so.3.4.0
00007f6e5d941000       4 rw--- 0000000000040000 008:00003 libdbus-1.so.3.4.0
00007f6e5d942000      36 r-x-- 0000000000000000 008:00003 libnih-dbus.so.1.0.0
00007f6e5d94b000    2044 ----- 0000000000009000 008:00003 libnih-dbus.so.1.0.0
00007f6e5db4a000       4 r---- 0000000000008000 008:00003 libnih-dbus.so.1.0.0
00007f6e5db4b000       4 rw--- 0000000000009000 008:00003 libnih-dbus.so.1.0.0
00007f6e5db4c000      96 r-x-- 0000000000000000 008:00003 libnih.so.1.0.0
00007f6e5db64000    2044 ----- 0000000000018000 008:00003 libnih.so.1.0.0
00007f6e5dd63000       4 r---- 0000000000017000 008:00003 libnih.so.1.0.0
00007f6e5dd64000       4 rw--- 0000000000018000 008:00003 libnih.so.1.0.0
00007f6e5dd65000     128 r-x-- 0000000000000000 008:00003 ld-2.12.so
00007f6e5df75000      20 rw--- 0000000000000000 000:00000   [ anon ]
00007f6e5df83000       4 rw--- 0000000000000000 000:00000   [ anon ]
00007f6e5df84000       4 r---- 000000000001f000 008:00003 ld-2.12.so
00007f6e5df85000       4 rw--- 0000000000020000 008:00003 ld-2.12.so
00007f6e5df86000       4 rw--- 0000000000000000 000:00000   [ anon ]
00007f6e5df87000     140 r-x-- 0000000000000000 008:00003 init
00007f6e5e1a9000       8 r---- 0000000000022000 008:00003 init
00007f6e5e1ab000       4 rw--- 0000000000024000 008:00003 init
00007f6e5ed77000     264 rw--- 0000000000000000 000:00000   [ anon ]
00007fffefae8000      84 rw--- 0000000000000000 000:00000   [ stack ]
00007fffefbe5000       4 r-x-- 0000000000000000 000:00000   [ anon ]
ffffffffff600000       4 r-x-- 0000000000000000 000:00000   [ anon ]
View Code

 

示例3:查看进程1的扩展格式

  #  pmap -x 1

【进程/作业管理】篇章一:Linux进程及管理(专用内存监控类工具)------【vmstat、pmap】【进程/作业管理】篇章一:Linux进程及管理(专用内存监控类工具)------【vmstat、pmap】
[root@test1 ~]# pmap -x 1
1:   /sbin/init
Address           Kbytes     RSS   Dirty Mode   Mapping
00007f6e5cb24000      48      24       0 r-x--  libnss_files-2.12.so
00007f6e5cb30000    2048       0       0 -----  libnss_files-2.12.so
00007f6e5cd30000       4       4       4 r----  libnss_files-2.12.so
00007f6e5cd31000       4       4       4 rw---  libnss_files-2.12.so
00007f6e5cd32000    1576     548       0 r-x--  libc-2.12.so
00007f6e5cebc000    2048       0       0 -----  libc-2.12.so
00007f6e5d0bc000      16      16      16 r----  libc-2.12.so
00007f6e5d0c0000       4       4       4 rw---  libc-2.12.so
00007f6e5d0c1000      20      20      20 rw---    [ anon ]
00007f6e5d0c6000      88      16       0 r-x--  libgcc_s-4.4.7-20120601.so.1
00007f6e5d0dc000    2044       0       0 -----  libgcc_s-4.4.7-20120601.so.1
00007f6e5d2db000       4       4       4 rw---  libgcc_s-4.4.7-20120601.so.1
00007f6e5d2dc000      28      20       0 r-x--  librt-2.12.so
00007f6e5d2e3000    2044       0       0 -----  librt-2.12.so
00007f6e5d4e2000       4       4       4 r----  librt-2.12.so
00007f6e5d4e3000       4       4       4 rw---  librt-2.12.so
00007f6e5d4e4000      92      56       0 r-x--  libpthread-2.12.so
00007f6e5d4fb000    2048       0       0 -----  libpthread-2.12.so
00007f6e5d6fb000       4       4       4 r----  libpthread-2.12.so
00007f6e5d6fc000       4       4       4 rw---  libpthread-2.12.so
00007f6e5d6fd000      16       4       4 rw---    [ anon ]
00007f6e5d701000     256     208       0 r-x--  libdbus-1.so.3.4.0
00007f6e5d741000    2044       0       0 -----  libdbus-1.so.3.4.0
00007f6e5d940000       4       4       4 r----  libdbus-1.so.3.4.0
00007f6e5d941000       4       4       4 rw---  libdbus-1.so.3.4.0
00007f6e5d942000      36      32       0 r-x--  libnih-dbus.so.1.0.0
00007f6e5d94b000    2044       0       0 -----  libnih-dbus.so.1.0.0
00007f6e5db4a000       4       4       4 r----  libnih-dbus.so.1.0.0
00007f6e5db4b000       4       4       4 rw---  libnih-dbus.so.1.0.0
00007f6e5db4c000      96      84       0 r-x--  libnih.so.1.0.0
00007f6e5db64000    2044       0       0 -----  libnih.so.1.0.0
00007f6e5dd63000       4       4       4 r----  libnih.so.1.0.0
00007f6e5dd64000       4       4       4 rw---  libnih.so.1.0.0
00007f6e5dd65000     128     108       0 r-x--  ld-2.12.so
00007f6e5df75000      20      20      20 rw---    [ anon ]
00007f6e5df83000       4       4       4 rw---    [ anon ]
00007f6e5df84000       4       4       4 r----  ld-2.12.so
00007f6e5df85000       4       4       4 rw---  ld-2.12.so
00007f6e5df86000       4       4       4 rw---    [ anon ]
00007f6e5df87000     140     128       0 r-x--  init
00007f6e5e1a9000       8       8       8 r----  init
00007f6e5e1ab000       4       4       4 rw---  init
00007f6e5ed77000     264     148     148 rw---    [ anon ]
00007fffefae8000      84      20      20 rw---    [ stack ]
00007fffefbe5000       4       4       0 r-x--    [ anon ]
ffffffffff600000       4       0       0 r-x--    [ anon ]
----------------  ------  ------  ------
total kB           19364    1540     312
View Code

 

示例4:循环显示进程3066的设备格式的最后1行,间隔2秒,

  #  while true; do pmap -d  3066 | tail -1; sleep 2; done

 

pmap命令文章来源:http://www.cnblogs.com/ggjucheng/p/3348439.html