SWAP的罪与罚(2)
可以看到系统有两个节点(其实就是两个物理CPU),它们各自分了16G内存,其中零号节点还剩100M内存,一号节点还剩10M内存。设想启动了一个需要11M内存的进程,系统把它分给了一号节点来执行,此时虽然系统总体的可用内存大于该进程需要的内存,但因为一号节点本身剩余的可用内存不足,所以仍然可能会触发SWAP行为。
需要说明的一点事,numactl命令中看到的各节点剩余内存中时不包括Cache内存的,如果需要知道,我们可以利用drop_caches参数先释放它:
shell> sysctl vm.drop_caches=1
注:这步操作可能会引起系统负载的震荡。
另:如何确定一个进程的节点及内存分配情况?网络上有现成的脚本。
如果要规避NUMA对SWAP的影响,最简单的方法就是在启动进程的时候禁用它:
shell> numactl --interleave=all ...
此外,内核参数zone_reclaim_mode通常也很重要,当某个节点可用内存不足时,如果为0的话,那么系统会倾向于从远程节点分配内存;如果为1的话,那么系统会倾向于从本地节点回收Cache内存。多数时候,Cache对性能很重要,所以0是一个更好的选择。
shell> echo "vm.zone_reclaim_mode = 0" >> /etc/sysctl.conf shell> sysctl -p
另:网络上有一些关于MySQL和SWAP的讨论,对于理解SWAP有一定意义,推荐:
补:Memcached在启动的时候如果带上了k选项,就能避免使用SWAP,但要慎用。
…
早些年,YouTube曾经被SWAP问题困扰过,他们当时的解决方法很极端:删除SWAP!不得不说这真是艺高人胆大,可惜对芸芸众生的我们而言,这实在是太危险了,因为如此一来,一旦内存耗尽,由于没有SWAP的缓冲,系统会立即开始OOM,结果可能会让问题变得更加复杂,所以大家还是安分守己做个老实人吧。
- 上一篇:让目录下创建的文件所属组继承该目录的所属组
- 下一篇:CentOS下安装Git