当你的Windows连续开机一个星期时,你是不是发现机器特别慢,点啥啥不开。但是你去看资源管理器的又发现内存占用也没有到90%,CPU也没跑满。那为什么这个时候会那么卡呢?
其中一个原因就是由于长期使用机器且没有关机,导致内存中缓存了大量的数据。由于系统的虚拟内存管理,当内存使用达到一定程度时,系统会将内存中 的数据交换到硬盘中,也就是Windos的虚拟内存,在Linux中叫Swap分区。此时如果要使用交换到硬盘上的数据,那么系统首先要把内存中最远最久没有 使用的数据交换到硬盘,再把硬盘中需要的数据加载到内存,然后才可以跑逻辑,这样就造成了“点啥啥不开”的残像了。
那么这样的情况会不会发生在我们的Server端Linux上呢?答案当然是肯定的。而且一旦该情况发生,有可能产生雪崩效应,一下就把服务器弄回老家了。 这里的典型案例就有云风大大遇到的Redis转储。又或者可以自己手写一个无限分配 内存并使用的例子。然后静静等待系统挂掉的那一刻。
那么什么时候会发生这样的情况?或者说当我们的系统表现出什么的症状时我们要考虑这样的情况?如何进行确诊?
一般当系统频繁的需要新内存时可能发生这样的情况,如频繁的读文件而不释放、网络接收大量文件写磁盘(写磁盘跟不上内存从网络接收的量)。此时我们的系统 对外相应速度会急剧下降但是CPU又没有跑满。这时我们就应该考虑是不是虚拟内存频繁交换的问题了。通过使用vmstat可以帮助我们来确诊是不是这个原因。
1. vmstat输出
裸奔运行vmstat命令,可以看到一行输出。该行输出内容表示的自系统最近启动后虚拟内存和CPU的平均情况。 在输出的第一行我们称之为表头。依次包含了:
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
几个字段,第二行我们称之为子表头,依次包含了: