• linux 假死分析


    所谓假死,就是能ping通,但是ssh不上去;任何其他操作也都没反应,包括上面部署的apache也打不开页面。

    作为一个多任务操作系统,要把系统忙死,忙到ssh都连不上去,也不是那么容易的。尤其是现在还有fd保护、进程数保护、最大内存保护之类的机制。你可以fork很多进程,系统会变得很慢,但是ssh还是能连上去;你可以分配很多内存,但是内存多到一定程度oom killer就会把你的进程杀掉,于是ssh又能工作了。

    有一个确定可以把系统搞成假死的办法是:主进程分配500MB内存,然后不停的fork,并且在子进程里面sleep(100)。

    这是什么原理?这是swap、copy on write、allocate on write、oom killer一起作用的结果。当主进程不停fork的时候,很快会把系统的物理内存用完,然后开始swap;在swap的时候触发了fork的copy on write属性;此时会需要分配真正的内存给之前copy on write的子进程,由于内存不足,这将触发oom killer开始杀进程;当oom killer杀掉了子进程,主进程立刻又fork了新的子进程,并再次导致内存用完,再次触发oom killer;于是死循环,而且oom killer是系统底层优先级很高的内核线程,也在参与死循环。

    此时机器可以ping通,但是无法ssh上去。这是由于ping是在系统底层处理的,没有参与进程调度;sshd要参与进程调度,但是优先级没oom killer高,总得不到调度。

    为什么要费那么大的力气把机器搞死?因为所有人都会遇到机器假死的情况。知道假死是怎么产生的,就可以针对假死的原因进行预防。
    其实建议使用nice将sshd的进程优先级调高。这样当系统内存吃紧,还能勉强登陆sshd,进入调试。然后分析故障。

  • 相关阅读:
    Python使用SMTP模块、email模块发送邮件
    harbor搭建及使用
    ELK搭建-windows
    ELK技术栈之-Logstash详解
    【leetcode】1078. Occurrences After Bigram
    【leetcode】1073. Adding Two Negabinary Numbers
    【leetcode】1071. Greatest Common Divisor of Strings
    【leetcode】449. Serialize and Deserialize BST
    【leetcode】1039. Minimum Score Triangulation of Polygon
    【leetcode】486. Predict the Winner
  • 原文地址:https://www.cnblogs.com/baozexu/p/11415459.html
Copyright © 2020-2023  润新知