解决Linux内存资源使用情况
跟踪物理内存使用情况(内存 +交换),并确定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(常驻集大小)是任务已使用的未交换物理内存。