最近明月再给几个使用宝塔面板的用户做服务器运维优化的时候发现不少人都会用到内存清理,甚至有个客户还特意留言给我要求设定定时内存清理的计划任务,说实话我真的被“雷”到了,从九十年代末接触 Linux 至今明月是万万没有想到还会有人把 Windows 上的清理内存习惯给带到 Linux 上来。
管理员无敌
在明月运维笔记博客上早期文章【跟 Windows 完全不同的 Linux 内存机制】一文里,其实明月有专门们给大家分享过 Windows 和 Linux 的内存机制是完全不同的两回事儿的,自己的这个几乎自用的笔记博客影响面几乎为零真的好尴尬。在删除了客户宝塔面板的定时清理内存计划任务后,明月就感觉有必要再次撰写一篇文章来给大家详细的阐述明白这个事儿。
在【跟 Windows 完全不同的 Linux 内存机制】一文里可能过于专业了,估计很多人看了开头就没有兴趣看下去了,今天明月就结合站长们很熟悉的插件、 WordPress 优化技巧等等尽量通俗易懂的给大家说清楚这个事儿,首先声明一个态度就是明月非常不提倡清理 Linux 内存,至于定时清理 Linux 内存更是无稽之谈,特别是在一台作为服务器的 Linux 系统上这样干,因为这简直就是类似于“挥刀自宫”,生生把 Linux 给阉割了,如果是定时的话那就是定时来一刀,日复一日的重复着!
首先,大家要知道一个原理,内存是目前计算机技术里存储速度最快的,所以将需要频繁请求的代码、数据放到内存里是最高效的方法了,随时需要随时就能以最快的速度获取到,这就是 Linux 内存机制要达到的目的。结合我们网站服务器的需要,PHP 有编译过的代码(借助 OPCache)、数据库 MySQL(借助 Memcached 或者 Redis)有查询语句代码、 WordPress 有运行对象数据(借助缓存插件)等等这些都要放在内存里来实现快速的获取以达到速度优化的目的,通俗点儿理解就是上述这些只需要 CPU 运算一次后就放到内存里,下次再需要了直接内存来调取出来即可,不用重复的计算浪费时间占用 CPU 负载,随着请求越来越多,缓存也会增加,自然内存占用比也会越来越高,如果内存不够是不是会崩溃呢?放心,Linux 早就有应对办法,那就是虚拟物理内存技术,也就是 Linux 里的 Swap 分区(硬盘上的一个专用分区)就是干这个的,一旦内存占用率达到 80%以上,Linux 就会将内存里的数据转存到 Swap 分区里,有需要的话再次读取加载到内存里被调用即可,这样的内存机制会带来一个好处就是无论你得前端访问量有多大,一般都不会让 CPU 负载飙升,最多会提高磁盘 IO 读写频率而已(具体可以参考【阿里云 ECS 上运行 WordPress & Typecho 的建议开启 Swap 分区】一文)。
如上图就是个很好的例子,哪怕内存占比达到 90%以上,CPU 和负载几乎都不会有任何飙升,甚至很多时候是 0 负载
这样又保证了服务器的稳定,又提升了前端请求的响应速度,这不是一种先进的内存机制吗?Linux 比 Windows 服务器好的优势主要就提现在这里了,说白了就是用最低的成本去干更多的事儿。
有了上述的解释,回过头来再来看我们如果清理了 Linux 的内存,是不是意味着缓存的失效,还得让 CPU 重复再运算一遍,前端访客的访问请求永远都是要重复计算一下占用 CPU 的负载。并且,如果 Swap 里有内存转存过来的数据也会成为冗余数据空占着磁盘空间失去管理无法释放又变相的增加了磁盘 IO 读写频率。只能说清理了 Linux 内存就是得不偿失!至于定时清理 Linux 内存跟上面结果一样,无法是有个定时,还要日复一日的得不偿失而已!
说的这里大家已经明白这个清理内存对 Linux 的危害了吧?有人会说让 CPU 一直闲着不运算也不科学呀?放心,CPU 不会闲着的,CPU 不忙不是意味着可以给 Nginx 提供更多的并发处理能力吗?一个 Linux 服务器都是多任务运行的,PHP 和 MySQL 任务用的少了,其他任务就可以用的多了,效率大大的提升了。很多人还会纠结 Linux 都被谁给用掉了,其实一般真的不用考虑这个问题的,Linux 先进的内存管理机制会非常完美的应对的,除非是被攻击或者木马、恶意代码啥才需要人工干预(进程管理),不到万不得已尽量不要人为干预 Linux 的内存管理,这也是 Linux 能做到不用重启的一个主要原因,明月的最高 Linux 不重启记录是 283 天!是的,你没有看错,就是运行了 283 天不用重启的,最后需要重启还是 Linux 内核更新需要重启生效。