解决Linux内存资源使用情况

时间:2020-03-21 11:46:18  来源:igfitidea点击:

跟踪物理内存使用情况(内存 +交换),并确定Debian Linux服务器上当前工作负载所需的内存量。

安装性能监控工具

如果尚未安装,请安装sysstat:

# apt-get update && apt-get install sysstat

对于RHEL/CentOS,请执行以下操作:

# yum install -y sysstat

sysstat软件包包含我们今天将要使用的sar系统性能工具。

确保在'/etc/default/sysstat'中启用了sar。
如果未启用,请执行此操作。

我们可能还希望将“/etc/sysstat/sysstat”中的历史记录值更改为不同于7天的值:

HISTORY=60

请注意,如果值大于28,则日志文件将保存在多个目录中,每个月一个。

默认情况下,sysstat将每10分钟收集一次数据。
我们可以通过修改cronjob'/etc/cron.d/sysstat'来更改此设置。

最后,重新启动服务:

# service sysstat restart

测量内存使用率

内存使用免费

free命令显示系统中空闲和已使用的物理内存和交换内存的总量,以及内核使用的缓冲区。

显示内存使用情况报告(以兆字节(-m)为单位):

$free -m

total   used  free  shared  buffers  cached
Mem:

998   985     12

0

25     615
-/+ buffers/cache:   344    654
Swap:

967   104    863

报告的值具有以下含义:

  • 998-已安装的物理内存总量(所有值均以MB为单位)。
  • 985-从OS角度来看当前正在使用的内存量。这确实包括缓冲区和缓存。
  • 12-从OS角度看,未以任何方式使用的内存量。
  • 0-共享内存,已过时。
  • 25-缓冲的内存量。简而言之,缓冲区用于缓存文件系统元数据(权限,位置等)并跟踪运行中的页面。
  • 615-缓存的内存量。缓存包含已从磁盘读取的数据,并保留在内存中以备将来使用,例如pdf文件或者Web浏览器页面。
  • 344-从应用程序的角度来看,当前正在使用的内存量。这不包括缓冲区和缓存。
  • 654-从应用程序的角度来看可用的内存量。这确实包括缓冲区和缓存。
  • 967-交换内存总量。
  • 104-正在使用的交换内存量。
  • 863-未使用的交换内存量。

344 MB是正在运行的进程实际使用的内存量。
654 MB是可以被认为“按需释放”的内存量,因为它很容易释放,两者之和就是物理内存总量:344 MB + 654 MB = 998 MB。

请注意,任何未使用的内存都是浪费金钱。
Linux系统始终尝试将所有可用的物理内存用于缓冲区和高速缓存,以便更快地运行。
缓冲区和缓存有助于减少I/O磁盘操作。

###/proc/meminfo的内存使用情况

查找内存使用情况统计信息的另一个地方是'/proc/meminfo':

$cat /proc/meminfo | head
MemTotal:

1022744 kB
MemFree:

14700 kB
Buffers:

4532 kB
Cached:

657328 kB
SwapCached:

10032 kB
Active:

396132 kB
Inactive:

561848 kB
Active(anon):

69940 kB
Inactive(anon):   238392 kB
Active(file):     326192 kB

与之前的free命令一样,“/proc/meminfo”提供的输出起初可能会令人困惑。
特别注意活动的内存行(蓝色标记)。
这是正在运行的进程正在使用的实际内存量。
MemFree字段报告从OS角度来看可用的内存量。

vmstat的内存使用情况

vmstat命令报告有关几种不同资源活动的信息,包括内存,CPU,进程,页面调度,块IO和磁盘活动。
报告的第一行给出自上次重新引导以来的平均值。
默认输出以KB(1024B)显示内存使用情况。

每隔一秒显示三个报告:

$vmstat 1 3
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu---
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa
 0  0 105596  19048  27664 532596    0    0    32     7   52   48  2  1 96  1
 0  0 105596  19048  27680 532620    0    0     0    40  293  484  2  0 97  1
 0  0 105596  19080  27680 532620    0    0     0     0  161  242  1  0 99  0

以一秒钟的间隔显示三个具有活动(-a)和非活动内存的报告:

$vmstat -a 1 3
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu---
 r  b   swpd   free  inact active   si   so    bi    bo   in   cs us sy id wa
 0  0 105596  19100 595012 363880    0    0    32     7   52   48  2  1 96  1
 0  0 105596  19092 595016 363896    0    0     0    20  212  346  1  1 98  0
 0  0 105596  19092 595020 363908    0    0     0     0  151  282  1  0 99  0

内存活动标记为蓝色。
显示以下值(根据手册页):

  • swpd:使用的虚拟内存量。
  • free:空闲内存量。
  • buff:用作缓冲区的内存量。
  • 缓存:用作缓存的内存量。
  • inact:不活动的内存量(-a选项)。
  • active:活动内存量(-a选项)。

交换活动以栗色标记。
显示以下值(根据手册页):

  • si:从磁盘(/s)交换的内存量。
  • 如此:交换到磁盘(/s)的内存量。

顶部的内存使用情况

如前所述,顶级程序提供了正在运行的系统的动态实时视图。

Top是一个很好的工具,可以在监视时找出哪些用户及其进程使用最多的内存。
要按内存对视图排序,请使用“ Ctrl” +“ M”组合。

如下所示(红色),MySQL几乎使用了所有可用内存的18%,而Nessus则进一步使用了10%。

$top
top - 21:40:02 up 4 days,  2:32,  1 user,  load average: 0.01, 0.05, 0.05
Tasks: 122 total,   1 running, 120 sleeping,   0 stopped,   1 zombie
%Cpu(s):  0.7 us,  0.8 sy,  0.0 ni, 98.4 id,  0.1 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem:   1022744 total,  1003528 used,    19216 free,    54352 buffers
KiB Swap:   991228 total,

876 used,   990352 free,   507736 cached
  PID USER

PR  NI  VIRT  RES  SHR S  %CPU %MEM    TIME+  COMMAND

2860 mysql     20   0  321m 176m 2712 S   1.0 17.7  74:07.10 mysqld
 1923 root

20   0  295m 103m 1476 S   0.4 10.4  89:00.31 nessusd
 2265 www-data  20   0 47264  12m 1976 S   0.0  1.3   0:03.46 apache2
 2254 www-data  20   0 47528  11m  628 S   0.0  1.2   0:02.90 apache2
 3174 www-data  20   0 29384  11m  960 S   0.0  1.1   0:02.69 zmfilter.pl
 3271 www-data  20   0 45948  10m  612 S   0.0  1.0   0:01.74 apache2
 3103 zabbix    20   0 59872   9m 9180 S   0.0  1.0   4:26.57 zabbix_server
 3102 zabbix    20   0 59872 9.9m 9156 S   0.0  1.0   4:28.83 zabbix_server
 3100 zabbix    20   0 59872 9.9m 9140 S   0.0  1.0   4:30.39 zabbix_server

第4行以蓝色标记,显示自上次刷新以来的内存使用量(以千字节计)。
第5行以靛蓝标记,显示自上次刷新以来的交换使用量(以千字节为单位)。

显示的其他与内存相关的值是:

  • VIRT:虚拟内存大小(以千字节为单位),任务使用的虚拟内存总量。
  • RES:常驻内存大小(以千字节为单位),任务已使用的未交换物理内存。
  • SHR:共享内存大小(以千字节为单位),可用于任务的共享内存量。
  • %MEM:内存使用率(RES),任务当前使用的可用物理内存份额。它的RES值以百分比表示。

ps的内存使用情况

ps命令可用于显示有关使用最多内存资源的进程的信息。
与top(可提供系统资源的动态实时视图)相比,ps报告了当前正在运行的进程的快照。

获取9个最消耗内存的过程的快照:

$ps -eo pid,user,s,comm,size,vsize,rss --sort -size | head
  PID USER     S COMMAND

SIZE    VSZ   RSS
 3059 mysql    S mysqld

330000 343552 172724
 2041 root     S nessusd

326112 333348 114108
 2297 bind     S named

42920  52976  1440
11763 www-data S apache2

26324 108256 27168
 2067 root     S rsyslogd

25452  28208  1092
 3547 www-data S zmfilter.pl     18900  29360  2348
11770 www-data S apache2

16676  98608 18132
11769 www-data S apache2

16380  98312 12880
11768 www-data S apache2

16128  98060 13284

使用的参数如下:

  • -e:选择所有进程。
  • -o:指定用户定义的格式。
  • pid:进程号。
  • 用户:用户名。
  • s:最小状态显示(一个字符)。
  • S用于睡眠(空闲)。
  • R运行。
  • D用于磁盘睡眠(不间断)。
  • Z代表僵尸(等待父母读取其退出状态)。
  • T表示已跟踪或者已暂停(例如,通过SIGTSTP)。
  • W用于分页。
  • comm:命令名称(仅可执行文件名称)。
  • size:内存大小(以千字节为单位)。
  • vsize:VM总大小(以千字节为单位)。
  • rss:常驻集大小,任务已使用的未交换物理内存。
  • -sort -size:按降序对大小进行排序。

sar的内存使用情况

正如我之前的一篇文章中前面提到的那样,sar命令提供系统中选定资源活动计数器的报告。

Sar可以显示实时使用情况并提取历史数据。

每隔一秒钟显示三个实时内存(-r)利用率报告:

$sar -r 1 3
Linux 3.2.0-4-686-pae (flames) 	22/02/14 	_i686_	(2 CPU)
21:44:31 kbmemfr kbmemused %memused kbbuffers kbcached kbcommit %commit kbactive kbinact
21:44:32   16660   1006084    98.37

9504   548592  1388856   68.96   395700  561884
21:44:33   16536   1006208    98.38

9504   548612  1388856   68.96   395700  561872
21:44:34   16536   1006208    98.38

9504   548612  1388856   68.96   395700  561872
Average:   16577   1006167    98.38

9504   548605  1388856   68.96   395700  561876

显示以下值(根据手册页):

  • kbmemfree:可用的可用内存量,以千字节为单位。
  • kbmemused:已用内存量(以千字节为单位)。这没有考虑内核本身使用的内存。
  • %memused:已用内存的百分比。
  • kbbuffers:内核用作缓冲区的内存量(以千字节为单位)。
  • kbcached:内核用于缓存数据的内存量(以千字节为单位)。
  • kbcommit:当前工作负载所需的内存量(以千字节为单位)。这是估计需要多少内存 /交换以保证永远不会有内存不足的估计。
  • %commit:当前工作负载所需的内存占内存总量(内存 + swap)的百分比。此数字可能大于100%,因为内核通常会过量使用内存。
  • kbactive:活动内存量(以千字节为单位)(最近使用过的内存,除非绝对必要,否则通常不回收)。
  • kbinact:不活动的内存量(以千字节为单位)(最近使用较少的内存。它更有资格被回收用于其他目的)。

要注意的有趣字段是“ kbcommit”(红色)和“%commit”(紫色)。
我们在运行这些测试的服务器上安装了1GB的物理内存以及1GB的交换空间。
这使物理内存总量达到2GB。
值得说明的是,从交换磁盘(甚至是基于SSD的磁盘)的加载比从内存的加载慢数千倍!

用红色标记的kbcommit列表示需要1,37 GB的内存来维护当前的工作负载。
这是可用总内存(内存 +交换)的68%。

让我们做一个简单的测试,让我们关闭交换,将总物理内存减少到1GB,然后再次运行sar命令。

# swapoff -a
$sar -r 1 3
Linux 3.2.0-4-686-pae (flames) 	22/02/14 	_i686_	(2 CPU)
21:45:08 kbmemfr kbmemused %memused kbbuffers kbcached kbcommit %commit kbactive kbinact
21:45:09   15720   1007024    98.46     10064   549060  1388856  135.80   395848  562740
21:45:10   15720   1007024    98.46     10064   549060  1388856  135.80   395848  562740
21:45:11   15720   1007024    98.46     10064   549060  1388856  135.80   395848  562740
Average:   15720   1007024    98.46     10064   549060  1388856  135.80   395848  562740

我们现在看到的是当前工作负载所需的内存百分比大于100%。
这是预期结果,因为我们将总物理内存(内存 +交换空间)减少了一半。

如果该百分比远远大于100%,则可能表明内存不足。

与sar交换空间使用

每隔一秒钟显示三个实时交换空间(-S)利用率报告:

$sar -S 1 3
Linux 3.2.0-4-686-pae (flames) 	22/02/14 	_i686_	(2 CPU)
21:20:51  kbswpfree  kbswpused  %swpused  kbswpcad  %swpcad
21:20:52  885632

105596     10.65     10032     9.50
21:20:53  885632

105596     10.65     10032     9.50
21:20:54  885632

105596     10.65     10032     9.50
Average:  885632

105596     10.65     10032     9.50

显示以下值(根据手册页):

  • kbswpfree:可用交换空间的大小,以千字节为单位。
  • kbswpused:已使用的交换空间量(以千字节为单位)。
  • %swpused:已用交换空间的百分比。
  • kbswpcad:缓存的交换内存量(以千字节为单位)。这是曾经被换出,被换回但仍在交换区域中的内存。
  • %swpcad:缓存的交换内存相对于已用交换空间量的百分比。

使用sar进行历史记忆,交换和交换统计

提取历史内存(-r),交换空间(-S)和交换(-W)统计记录开始时间(-s)1 PM和结束时间(-e)2 PM时间间隔:

$sar -rSW -s 13:00:00 -e 14:00:00
Linux 3.2.0-4-686-pae (flames) 	22/02/14 	_i686_	(2 CPU)
13:05:01  pswpin/s pswpout/s
13:15:01

0.35

0.00
13:25:01

0.00

0.00
13:35:01

0.00

0.00
13:45:01

0.00

0.00
13:55:01

0.00

0.00
Average:

0.07

0.00
13:05:01 kbmemfr kbmemused %memused kbbuffers kbcached kbcommit %commit kbactive kbinact
13:15:01   72604    950140    92.90    119752   485124  1360700   67.56   380456  517556
13:25:01   71140    951604    93.04    120936   485596  1360700   67.56   383268  516392
13:35:01   69412    953332    93.21    122288   485840  1360700   67.56   385148  516124
13:45:01   67964    954780    93.35    123444   486256  1360700   67.56   387216  515620
13:55:01   66320    956424    93.52    124596   486580  1360700   67.56   389328  514988
Average:   69488    953256    93.21    122203   485879  1360700   67.56   385083  516136
13:05:01 kbswpfree kbswpused %swpused  kbswpcad  %swpcad
13:15:01    885548    105680    10.66

9192     8.70
13:25:01    885548    105680    10.66

9192     8.70
13:35:01    885548    105680    10.66

9192     8.70
13:45:01    885548    105680    10.66

9192     8.70
13:55:01    885548    105680    10.66

9192     8.70
Average:    885548    105680    10.66

9192     8.70

显示以下交换统计信息值:

  • pswpin/s:每秒系统引入的交换页面总数。
  • pswpout/s:系统每秒带出的交换页面总数。

具有历史统计数据,可以将这些数据与实时使用情况报告进行比较,以帮助识别内存问题和系统运行缓慢。

使用smem交换空间使用情况

Smem是报告物理内存使用情况的工具。
安装它:

# apt-get install smem

对于RHEL/CentOS,请从EPEL存储库安装:

# yum install -y smem

显示反向排序的(-rs)总数(-t):

# smem -t -rs swap | head -n6
  PID User     Command

Swap

USS

PSS

RSS 
19811 sandy    /usr/bin/dbus-daemon --fork   101372     1404     1550     1972 
22119 root     ntop -cd -i eth0 -u ntop -W    45420   163264   165056   168328 
30636 sandy    /usr/bin/java -ea -Xmx512m     42296   269296   271184   279456 
 9517 sandy    /usr/lib/chromium/chromium     16508   157552   161675   169548 
21068 root     /usr/lib/virtualbox/Virtual    12036  2193916  2198383  2204564

以百分比(-p)显示反向排序的(-rs)总计(-t):

# smem -t -p -rs swap | head -n6
  PID User     Command

Swap

USS

PSS

RSS 
19811 sandy    /usr/bin/dbus-daemon --fork    1.25%    0.02%    0.02%    0.02% 
22119 root     ntop -cd -i eth0 -u ntop -W    0.56%    2.01%    2.03%    2.07% 
30636 sandy    /usr/bin/java -ea -Xmx512m     0.52%    3.33%    3.35%    3.45% 
 9517 sandy    /usr/lib/chromium/chromium     0.20%    1.94%    1.99%    2.09% 
21068 root     /usr/lib/virtualbox/Virtual    0.15%   26.99%   27.05%   27.12%

从smem手册页中,未共享的内存报告为USS(唯一集大小)。
未共享内存(USS)加上进程在共享内存中所占的比例被报告为PSS(比例集大小)。
USS和PSS仅包括物理内存使用情况。
它们不包括已换出到磁盘的内存。
RRS(常驻集大小)是任务已使用的未交换物理内存。