Linux 是一个非常棒操作系统。几乎所有的更新中,它都在不断的完善中。 现在已经呈现出:从小到手机,大到超级计算机,无处不在运行着Linux。而其平均每8个星期就会有新的版本发行出来,并且伴随着很大的变化。对于生产环 境中的服务器,这通常会造成一些技术上的苦恼以及问题。我们也会在文章讨论到这些问题。

其中对于swap的问题。所有人都不希望使用到swap,但是对于在生产中的Linux服务器如何才能正确的使用,分配,管理,监控 swap?

首 先是swappiness。这是一个Linux内核参数,并且可以通过sysctl来调控Linux系统采用什么机制来调配物理内存与cache交换。  在很多的Linux发行版本中其swappiness参数通常是设置为60,而这个设置是非常不合理的。 我们通常设置swappiness为0,在生产服务器中尽量避免使用swap分区。 在很多的层面来说使用swap是非常不正常的,例如在实际环境中,任何在使用swap的进程都将被冻结,而这对于多线程的服务器(例如运行 着:MySQL,Java,这时如果这些进程正在使用swap,那么当1秒,10秒,100秒,进程会冻结被杀死) 而这都是非常致命的危险。如果确实是物理内存不足,而想使用swap作为’虚假‘内存来使用,但是如果将swappiness 设置为60,即使在服务器还有GB的内存没有在使用,任然非常容易出现问题。

对于一些很老的应用程序和为了作为cache使用,也许 swap的使用是一个有用的选择。 但是我们依然是建议将swappiness参数设置为20-30之间,尽管设置为0才是最推荐的选择。也许有人会认为使用一些swap可以排除一些不在使 用的代码,但是这写代码并不会在真正的生产环境中产生,并且这些代码通常会很小。

第二个是swap的监测。我们有时候会有一些关于内存 的 问题,并且有swap正在使用,但是系统很难告知我们具体是什么程序正在使用swap。 我们为什么关心这个问题? 一个好的理由是:我们只是想知道。但是更为重要的是,及时当内存可使用量变低的时候,将会有程序开始使用swap,在这种情况下,我们的监控会发出警报。 我们也会关注内存的变化,看是否还在继续降低(尽管理论上讲:swap 的cache 的大小会告知我们危险的程度,对于我们的工程师是个需要分析原因的问题)。如果我们知道哪些服务正在使用swap,我们会考虑重启服务程序来移除正在使用 的swap数据(例如通常对于数据库服务器来说我们会这么做)。但是很多客户在一台性能高的服务器上有很多的程序在运行时,我们也可以使用相应的工具来检 查出具体是什么程序在使用swap。

第三个是swap的释放。由上所述,我们得知在一些情况下swap将会被使用,这可能持续使用几 天, 几星期,或者长达几个月,尽管这部分swap中的数据现在不需要使用。很多种情况是swap的cache可以被立即释放,但是没有一种办法可以做到这样。 所以最可行的方式是立即终止使用swap,正如我们可以终止使用文件的缓存。第二种是强迫尽量使应用程序减少使用swap,这样对于我们服务器更加合适。

第 四个是随机的swap。linux是非常复杂并精密的,但对于swap的使用依然没有很好地解决办法,似乎没人知道为什么。最近发现一些归咎于NUMA的 问题,但是仍然不是很明确具体的原因,特别是在一些老的版本内核中(2.6.3x之前的版本,当然也包含使用2.6.18内核的RH/Centos 5.x)。 即使在今天,我们通常分配一些swap,因为当内核在没有swap的情况下并不能非常良好的工作(例如:当没有swap分区的时候,及时一些有这超大内存 的EC2服务器,也会出现负载问题。 例如:系统会出现一些CPU使用100%等一些不正常的现象)。新的内核确实已经变得更加完善,但是仍有很多需要改进的。