Solaris 如何检查和分析内存的使用情况

对性能问题进行故障排除是每个系统管理员都必须具备的一项重要技能。
这篇文章旨在提供一些提示,即在检查和排除内存使用情况时要查找的位置。
原则上,内存使用情况的调查分为内核内存和用户内存的使用情况检查。

请注意,如果系统出现内存使用问题,纠正措施通常需要深入的知识,并且必须非常小心地执行。
首先,我们需要检查内核中使用了多少内存,以及用户内存中使用了多少。
决定需要哪些进一步的故障排除步骤很重要。

一个非常有用的 mdb dcmd 是 '::memstat '(此命令可能需要几分钟才能完成)。
以下示例来自 Solaris 11.2.

# echo "::memstat" | mdb -k
Page Summary                 Pages             Bytes  %Tot
----------------- ----------------  ----------------  ---
Kernel                      585584              4.4G   14%
Defdump prealloc            204802              1.5G    5%
Guest                            0                 0    0%
ZFS Metadata                 21436            167.4M    0%
ZFS File Data               342833              2.6G    8%
Anon                         56636            442.4M    1%
Exec and libs                 1131              8.8M    0%
Page cache                    4339             33.8M    0%
Free (cachelist)              8011             62.5M    0%
Free (freelist)            2969532             22.6G   71%
Total                      4194304               32G

用户内存使用:打印出使用大多数用户内存的进程

% prstat -s 按用户空间虚拟内存消耗排序的大小。

% prstat -s rss 按用户空间物理内存消耗排序。

% prstat -s rss
   PID USERNAME  SIZE   RSS STATE  PRI NICE      TIME  CPU PROCESS/NLWP
  4051 user1     297M  258M sleep   59    0   1:35:05 0.0% mysqld/10
 26286 user2     229M  180M sleep   59    0   0:05:07 0.0% java/53
 27101user2    237M  150M sleep   59    0   0:02:21 0.0% soffice.bin/5
 23335user2    193M  135M sleep   59    0   0:12:33 0.0% firefox-bin/10
  3727 noaccess  192M  131M sleep   59    0   0:36:22 0.0% java/18
 22751 root      165M  131M sleep   59    0   1:13:12 0.0% java/46
  1448 noaccess  192M  108M sleep   59    0   0:34:47 0.0% java/18
 10115 root      129M   82M sleep   59    0   0:31:29 0.0% java/41
 20274 root      136M   77M stop    59    0   0:04:08 0.0% java/25
  3397 root      138M   76M sleep   59    0   0:12:42 0.0% java/37
 12949 pgsql      81M   70M sleep   59    0   0:09:36 0.0% postgres/1
 12945 pgsql      80M   70M sleep   59    0   0:00:05 0.0% postgres/1

用户内存使用:显示共享内存和信号量

% ipcs -a 
IPC status from 
T  ID     KEY        MODE     OWNER   GROUP  CREATOR  CGROUP CBYTES  QNUM     QBYTES  LSPID  LRPID   STIME    RTIME    CTIME
Message Queues: 
q  0  0x55460272 -Rrw-rw----   root    root     root    root    0       0     4194304  1390  18941  14:12:20  14:12:21  10:23:32 
q  1  0x41460272 --rw-rw----   root    root     root    root    0       0     4194304  5914   1390   8:03:34   8:03:34  10:23:39 
q  2  0x4b460272 --rw-rw----   root    root     root    root    0       0     4194304     0      0  no-entry  no-entry  10:23:39 
T  ID      KEY       MODE      OWNER     GROUP CREATOR    CGROUP    NATTCH       SEGSZ  CPID   LPID     ATIME     DTIME    CTIME 
Shared Memory: 
m  0  0x50000b3f --rw-r--r--   root      root     root      root         1           4   738   738   18:50:36  18:50:36  18:50:36 
m  1  0x52574801 --rw-rw----   root    oracle     root    oracle        35  1693450240  2049  26495  10:30:00  10:30:00  18:51:13 
m 8201 0x4d2     --rw-rw-rw-   root      root     root      root         0       32008  1528   1543  10:26:03  10:26:04  10:25:53
T  ID  KEY       MODE     OWNER       GROUP       CREATOR        CGROUP         NSEMS     OTIME    CTIME
Semaphores: 
s  0   0x1   --ra-ra-ra-   root        root          root         root              1     16:17:35  18:50:33 
s  1     0   --ra-ra----   root       oracle         root         oracle           36     10:33:28  18:51:17 
s  2     0   --ra-ra----   root       oracle         root         oracle           13     10:33:28  18:51:27 
s  3     0   --ra-ra----   root       oracle         root         oracle           14     10:33:28  18:51:34 
s  4     0   --ra-ra----   root       oracle         root         oracle           16     10:33:27  18:51:42 
s  5 0x4d2   --ra-ra-ra-   root       root           root         root               1    no-entry  10:25:53 
s  6 0x4d3   --ra-ra-ra-   root       root           root         root               1    no-entry  10:25:53

用户内存使用情况:列出所有进程的用户内存使用情况(PID 0、2. 3除外)

# pmap -x /proc/* > /var/tmp/pmap-x

这些进程的总使用量的简短列表

% egrep "[0-9]:|^total" /var/tmp/pmap-x 
     1:   /sbin/init 
total Kb 2336 2080  128 - 
1006:  rlogin cores4
total Kb 2216 1696    80 - 
1007:  rlogin cores4
total Kb 2216 1696  104 - 
  115:  /usr/sbin/nscd
total Kb 4208 3784 1704 - 
-- snip -

用户内存使用情况:检查 /tmp 的使用情况

% df -kl /tmp 
Filesystem kbytes        used        avail capacity  Mounted on  
swap        1355552    2072 1353480        1%      /tmp

打印 /tmp 中最大的 10 个文件和目录:

% du -akd /tmp/ | sort -n | tail -10
288     /tmp/SUNWut
328     /tmp/log
576     /tmp/ips2
584     /tmp/explo
608     /tmp/ipso
3408    /tmp/sshd-truss.out
17992   /tmp/truss.p
22624   /tmp/js
49208   /tmp

用户内存使用情况:系统上的总体内存使用情况

% vmstat -p 3
     memory           page          executable      anonymous      filesystem
   swap  free     re  mf  fr  de  sr  epi  epo  epf  api  apo  apf  fpi  fpo  fpf
19680912 27487976 21  94   0   0   0    0    0    0    0    0    0   14    0    0
 3577608 11959480  0  20   0   0   0    0    0    0    0    0    0    0    0    0
 3577328 11959240  0   5   0   0   0    0    0    0    0    0    0    0    0    0
 3577328 11959112 38 207   0   0   0    0    0    0    0    0    0    0    0    0
 3577280 11958944  0   1   0   0   0    0    0    0    0    0    0    0    0    0

scanrate 'sr' 应该是 0 或者接近于零

交换空间使用情况

% swap -l 
swapfile              dev    swaplo  blocks      free
/dev/dsk/c0t0d0s1   32,25        16  1946032  1946032
% swap -s 
total: 399400k bytes allocated + 18152k reserved = 417552k used, 1355480k available

通用内核统计信息

以可解析的格式打印所有内核统计信息。

% kstat -p > /var/tmp/kstat-p

内核内存统计

% kstat -p -c kmem_cache 
% kstat -p -m vmem 
% kstat -p -c vmem
% kstat -p | egrep zfs_file_data_buf | egrep mem_total

除了 kstat,我们还可以使用 kmastat 打印 kmastat 缓冲区来获取内核内存使用情况。

# echo "::kmastat" | mdb -k > /var/tmp/kmastat
% more /var/tmp/kmastat 
    cache                     buf    buf    buf     memory     alloc  lloc 
    name                     size in use   total    in use   succeed  fail
 ------------------------- ------ ------  ------ --------- --------- ----
  kmem_magazine_1              16    470     508      8192       470     0
  kmem_magazine_3              32    970    1016     32768      1164     0 
  kmem_magazine_7              64   1690    1778    114688      1715     0

在“正在使用的内存”列中查找最高数字,并在“分配失败”列中查找任何大于“0”的数字。

日期:2020-09-17 00:15:04 来源:oir作者:oir