在有32个RAM的盒子上运行MySQL。 交换99%已满,并有大约200 MB的RAM空闲。 MySQL是当然的罪魁祸首。 当内存和交换完全填满时会发生什么? 谢谢!
9/10 OOM杀手将会以最大的内存消耗来杀死这个程序。 否则你的系统会崩溃。
我假设你在Linux上。
这取决于操作系统,但是当你真的用完东西死亡。 更具体地说,对操作系统说“请给我更多的内存”,操作系统说“不”。
(这可以通过仅仅触摸已经被告知的一些内存来分配,导致页面在写入时拷贝,所以它不像“调用内核内存分配器”那样简单)。
从技术上讲,这个过程可以处理这些故障并恢复,但实际上它会导致崩溃。
Linux尽力猜测一个好的候选人是干什么的,而且我认为Windows在你达到这个状态之前也是这样做的 – 尽可能地更干净地杀掉一些东西,这样内存就被释放了。
由于可用RAM是浪费RAM,Linux尽可能使用尽可能多的内存。 RAM中可能有很多caching的磁盘页面和其他东西,只是因为有空间。 运行free -m来查看您的机器上如何使用RAM。 它还会显示如果需要,应用程序可以使用的megs的数量(“free”,第二行)。
打开一些备用的ssh会话,直到不晚。 当系统没有可用的RAM /交换时,不能启动新的进程。
似乎有些查询产生了存储在临时表中的意外数量的数据 – 在内存中。 尝试杀死由mysql启动的最古老的线程:
SELECT ID, USER, HOST, DB, COMMAND, TIME, STATE, LEFT(INFO, 51200) AS Info FROM information_schema.PROCESSLIST;
Field TIME显示执行查询所用的秒数。 时间最长的人可能是罪魁祸首。
尝试部署像New Relic这样的自定义代理来查看哪些进程是不必要的,并开始将其杀死。 这可以节省您的服务器崩溃