性能监控-Swap Space
服务器性能监控包含许多内容,比如系统负载、CPU使用率、网络带宽使用情况、IO调用频率等等,Swap的使用情况也为我们对服务器性能监控提供补充。
Swap 介绍
用户进程内存空间中数据有两种:
- 从文件系统中读进来的数据 (主要有文件内容高速缓存, 程序代码和共享库)
- 程序使用的堆栈空间
而Linux 是一个分页请求系统, 用户进程使用的所有内存需要映射到物理内存:
- 应用程序的地址空间是虚拟空间, 是按被分成固定大小的页 (page) 来管理的
- 物理内存也是按固定大小的页框 (page frames) 来组织
- 虚拟页面 (page) 需要由操作系统映射到物理内存中的页框 (page frames)
为了更好的利用物理内存, Linux 会对在物理内存中的页面进行回收
- 如果存放的是程序代码或共享库, 可以直接回收 (以后需要的时候可以从文件里面直接读入)
- 如果缓存的是文件内容, 如果是脏页, 先写回磁盘后再回收; 如果不是脏页可以直接回收
- 而对于程序使用的堆栈空间, 由于没有对应的文件 (叫做 "匿名页", anonymous pages), 只能是备份到磁盘上一块专门的分区, 这个专门的分区就是 Swap Space.
- 一旦回收算法既不能从文件缓存回收内存, 又不能从正在使用的匿名页中回收内存, 而系统需要满足更多的内存请求, 这个时候只能用最后一招了: OOM kill.
从 swap space 的原理得出以下结论:
- Swap Space 不会拖慢系统. 事实上, 不分配 swap space 并不代表就没有换进换出发生 (非匿名页还是可能会被换进换出).有了 Swap Space, 只是说在试图回收内存时, Linux 有了更多的选择
- Swap Space 只是匿名页专用的. 在任何情况下, 程序代码, 共享库, 文件系统cache不会使用 Swap Space
- 由上面的 1, 2 两点可以知道: "尽量给 Swap Space 分配很小的空间" 唯一的好处就是不浪费磁盘空间 (也就是说最小化 Swap Space 大小并不能提升系统性能)
- 系统监控时, 要特别注意是否发生了 OOM 的情况, 一旦 OOM 发生, Linux 会自己挑选一个消耗内存较大, 又不 "重要" 的程序 kill 掉来回收内存 (但很多时候被 kill 掉的正好是某个应用程序)
监测 Swap Space的使用情况
使用free命令可以查看Swap的使用情况
# free
total used free shared buff/cache available
Mem: 1016288 128340 655356 1676 232592 648368
Swap: 2097148 607180 1489968
Swap行显示的Swap的使用情况
- total 显示 Swap Space总的容量为 2G
- used 显示 Swap Space 已经使用了592M
- free 显示 Swap Space 空闲1455M
重点是看看 used/total 的比值, 这里是 29%。特别需要注意的是, 这个比值较高时, 并不等于系统内存紧张了. 只有当在 Swap Space 上有大量的换入换出操作时才说明出现了内存紧张.
使用用 vmstat 或 sar -W 命令来监控换入换出操作的状况
# vmstat
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
2 0 607176 650856 20164 214524 0 0 4 10 0 1 1 0 99 0 0
# sar -W
Linux 3.10.0-693.5.2.el7.x86_64 (VM_1_194_centos) 08/02/2019 _x86_64_ (1 CPU)
12:00:02 AM pswpin/s pswpout/s
12:10:02 AM 0.00 0.00
12:20:02 AM 0.00 0.00
12:30:01 AM 0.00 0.00
12:40:01 AM 0.00 0.00
12:50:01 AM 0.00 0.00
01:00:01 AM 0.00 0.00
01:10:01 AM 0.00 0.00
01:20:02 AM 0.00 0.00
01:30:01 AM 0.00 0.00
01:40:01 AM 0.00 0.00
01:50:02 AM 0.00 0.00
02:00:01 AM 0.00 0.00
02:10:01 AM 0.00 0.00
02:20:01 AM 0.00 0.00
02:30:01 AM 0.00 0.00
02:40:01 AM 0.00 0.00
02:50:01 AM 0.00 0.00
03:00:02 AM 0.00 0.00
03:10:01 AM 0.00 0.00
03:20:01 AM 0.00 0.00
实验的机器可以看出, 虽然 Swap Space 被使用了一点, 但是没有在 Swap Space 上换入换出, 系统性能整体还是不错的.
总之, 系统性能可能出现以下几种情况:
- 极好: Swap Space 没有被使用. 物理内存的使用也很少.
- 好: Swap Space 用了一点, 但是在 swap space 上没有换进换出的操作
- 还行: Swap Space 用了一点. 有少量的在 Swap Space 上的 换进换出的操作. 不过系统的吞吐量还是不错 (CPU在 User 上的消耗还比较高, 也就是说明此时在 Swap Space 上的换入换出还没有造成系统瓶颈)
- 有问题: 在 Swap Space 上有大量的换入换出操作, 同时 CPU 在 Sys 和 Wait 上的消耗很高 (这种情况就是说明内存不够用了, 需要查看是否有程序发生了内存泄漏)
- 有问题: 系统运行良好, 但是启动新程序会由于内存不足而失败 (这种情况是 Swap Space 分配得太小了)
优化 Swap space 性能
vm.swappiness (缺省值是60). 设置成0, Linux 会尽可能的避免把内存交换出去 (可以让系统有好的响应时间). 相反, 如果设置成100, Linux 会尽量的使用 swap space.
vm.overcommit_memory (缺省值是0):
- 0: 允许 overcommit (当收到申请内存的请求时, Linux 用一套heuristic方法来决定是否要 overcommit), 但是就像前面提到的, overcommit 之后, 当真正需要用到这些内存时, 如果回收算法又不能回收到任何物理内存, 只好OOM kill 掉一个进程
- 1: 总是允许 overcommit (Redis 就建议这样设置)
- 2: 不允许进行 overcommit, 一旦申请的空间超出总空间 (总空间 = 物理空间 + swap space size x overcommit_ratio, overcommit_ratio 缺省值是 50%), 就报错
选择自己应用合理的值将配置添加到 /etc/sysctl.conf
, sysctl -p
或者 重启生效。