swap初探
线上机器不停发邮件报警,swap使用超过阀值。实在受不了邮件,决定干点运维的活。看看情况。
查swap整体使用情况
-
free -m
最先最直接就是这条命令了,结果类似下图
total used free Swap: 34175 11374 22801
-
sar -r(不同版本sar参数不同,sar -h看看就好),如下图
Linux 2.6.18-308.el5 (a05.api.box.ott.b28.youku) 04/07/16 00:00:01 kbmemfree kbmemused %memused kbbuffers kbcached kbswpfree kbswpused %swpused kbswpcad 00:10:01 11397792 21517364 65.37 305740 14510832 4192956 0 0.00 0 00:20:01 11364748 21550408 65.47 307644 14539508 4192956 0 0.00 0 00:30:01 11341260 21573896 65.54 308772 14566856 4192956 0 0.00 0 00:40:01 11314416 21600740 65.63 309704 14593728 4192956 0 0.00 0 00:50:01 11286120 21629036 65.71 310612 14619356 4192956 0 0.00 0 01:00:01 11262720 21652436 65.78 311348 14642836 4192956 0 0.00 0 . . . Average: 10691597 22223559 67.52 331646 15190674 4192956 0 0.00 0
sar和free都不是实时数据。如果要看实时数据vmstat
-
vmstat -2(2秒刷新一次)。结果如图
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------ r b swpd free buff cache si so bi bo in cs us sy id wa st 5 0 0 9797884 356252 16031016 0 0 0 8 0 0 10 4 87 0 0 0 0 0 9797988 356300 16031348 0 0 0 185 11497 30788 9 2 89 0 0 17 0 0 9797240 356304 16031532 0 0 0 0 11430 30918 8 2 90 0 0
si: Amount of memory swapped in from disk (/s).
so: Amount of memory swapped to disk (/s).
si和so越小越好咯,只要不是一直不为0,都没事
按进程查看swap使用
-
top(top命令提供的SWAP信息只是一个理论值,计算公式是:SWAP=VIRT-RES,不可信)
top --> 按「f」进入字段选择 --> 按「p」选择「SWAP」字段,再按「u」选择Page Fault字段 --> 回车确认 -->结果如下 --> 「Shifl」+「+」+「>」按某个字段排序,默认按cpu使用率
top - 10:45:37 up 29 days, 17:06, 1 user, load average: 0.02, 0.22, 0.31 Tasks: 616 total, 5 running, 611 sleeping, 0 stopped, 0 zombie Cpu(s): 8.9%us, 2.2%sy, 0.0%ni, 88.3%id, 0.0%wa, 0.0%hi, 0.6%si, 0.0%st Mem: 32986852k total, 32795452k used, 191400k free, 146108k buffers Swap: 4194300k total, 1296k used, 4193004k free, 26758872k cached PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ SWAP nFLT COMMAND 31022 root 19 0 6994m 234m 11m S 0.3 0.7 657:47.61 6.6g 100 java 9344 nobody 20 0 259m 21m 1152 S 0.0 0.1 3:04.89 88 0 nginx 9345 nobody 20 0 259m 21m 1152 S 0.0 0.1 2:54.11 88 0 nginx 9346 nobody 20 0 259m 21m 1152 S 0.0 0.1 3:11.32 88 0 nginx 9347 nobody 20 0 259m 21m 1152 S 0.0 0.1 2:59.73 88 0 nginx 9348 nobody 20 0 259m 21m 1152 S 0.0 0.1 3:03.24 88 0 nginx 9349 nobody 20 0 259m 21m 1152 S 0.0 0.1 3:01.04 88 0 nginx 9350 nobody 20 0 259m 21m 1152 S 6.9 0.1 3:00.65 88 0 nginx 9351 nobody 20 0 259m 21m 1152 S 0.0 0.1 3:09.42 88 0 nginx 9352 nobody 20 0 240m 1548 572 S 0.0 0.0 0:00.20 88 0 nginx 15510 root 20 0 240m 2428 1520 S 0.0 0.0 0:00.09 88 3 nginx 2133 root 20 0 243m 2372 912 S 0.0 0.0 0:00.90 4 53 rsyslogd 1 root 20 0 19232 1112 820 S 0.0 0.0 0:02.22 0 9 init
可以看到最高的是个java进程,使用了6.6g,但是我们swap实际只有4g,可以印证数值不准。但是每个进程的使用分布是准的,就是说java > nginx > rsyslogd这个关系是准的。你可以理解为,top把每个进程使用的swap同等放大或缩小,但是不改变大小关系。
Swappiness
从sar结果可以看出物理内存平均使用才67%,但是swap已经被用到了。实际上,当可用内存不足时,系统有两个选择:一个是通过SWAP来释放内存,另一个是删除Cache中的Page来释放内存。一个很常见的例子是:当拷贝大文件的时候,时常会发生SWAP现象。这是因为拷贝文件的时候,系统会把文件内容在Cache中按Page来缓存,此时一旦可用内存不足,系统便会倾向于通过SWAP来释放内存。
内核中的swappiness参数可以用来控制这种行为,缺省情况下,swappiness的值是60:
sysctl -a | grep swappiness
vm.swappiness = 60
意思是:如果系统需要内存,有百分之六十的概率执行SWAP
考虑到机器内存仍有剩余,修改此参数,降低使用swap概率,尽可能使用物理内存,但并不意味着永远不会执行SWAP。网上传言设置为0,会有灵异问题出现,公司线上机器不敢拿来做实验,就设置1好了
shell> echo "vm.swappiness = 1" >> /etc/sysctl.conf shell> sysctl -p
这个不要随便设置,请确定物理内存确实是有剩余,设置0了可能内存耗尽,没有swap缓冲,系统会立即开始OOM,问题可能会更惨烈。
修改后过了一天再看sar,Average 内存使用飙到99.37%,但是swap确实没有超过阀值报警。