zoukankan      html  css  js  c++  java
  • Linux系统卡死后紧急处理

    前言:Linux系统卡死了的情况有很多,最常见的是系统负载过高导致的。还可以运行内存耗用极大的程序(如虚拟机),也会迅速提升系统负载。注意:不能再试图依赖任何图形界面的东西,如 Gnome的系统监视器,只会继续加重这种卡死的局面。
    有时系统负载过大,程序不能及时响应,很容易死机。个人用户强行关机再重启就OK。但是对于需要全天工作提供服务的服务器来说,强行关机不仅会导致服务器停止工作,同时造成未同步的数据丢失。
    总结下尝试的解决方法
    1. 进入TTY终端
    a. Ctrl+Alt+Fn(F1-F6)进入TTY1终端字符界面, 输入用户名和密码以登录

    b. free命令可查看内存使用情况

    [root@rhel7 ~]# free -m
                  total        used        free      shared  buff/cache   available
    Mem:           3778         171        3411           8         194        3399
    Swap:          3967           0        3967

    c. 开始清理内存(需要root权限)

    sync 
    echo 1 > /proc/sys/vm/drop_caches
    echo 2 > /proc/sys/vm/drop_caches
    echo 3 > /proc/sys/vm/drop_caches

    sync的作用是将所有正在内存中的缓冲区写到磁盘中,其中包括已经修改的文件inode、已延迟的块I/O以及读写映射文件,从而确保文件系统的完整性。
    注释:1:释放页缓存 2:释放dentries和inodes 3:释放所有缓存

    d.top查看CPU使用情况
    进入后用top命令查看进程表,等待进程信息表刷新一两次,就可以确定占用资源比较大的进程了,然后输入q退出,回到终端内,把占用资源比较大的进程kill掉,这样可以解决相当一部分问题。

    [root@rhel7 ~]# top
    top - 02:15:55 up  8:54,  2 users,  load average: 0.02, 0.02, 0.05
    Tasks: 433 total,   1 running, 432 sleeping,   0 stopped,   0 zombie
    %Cpu(s):  0.0 us,  0.0 sy,  0.0 ni, 99.9 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
    KiB Mem :  3868768 total,  3492268 free,   176756 used,   199744 buff/cache
    KiB Swap:  4063228 total,  4063228 free,        0 used.  3480144 avail Mem 
    
       PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                                        
       137 root      20   0       0      0      0 S  20.0  0.0   1:09.00 rcu_sched                                                      
       141 root      20   0       0      0      0 S  16.0  0.0   0:03.53 rcuos/3                                                        
      4550 root      20   0  130284   1984   1200 R  12.0  0.1   0:00.12 top                                                            
         1 root      20   0   57580   7556   2656 S   0.0  0.2   0:02.89 systemd                                                        
         2 root      20   0       0      0      0 S   0.0  0.0   0:00.22 kthreadd                                                       
         3 root      20   0       0      0      0 S   0.0  0.0   0:00.58 ksoftirqd/0                                                    
         5 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 kworker/0:0H                                                   
         7 root      rt   0       0      0      0 S   0.0  0.0   0:05.33 migration/0                                                    
         8 root      20   0       0      0      0 S   0.0  0.0   0:00.00 rcu_bh                                                         
         9 root      20   0       0      0      0 S   0.0  0.0   0:00.00 rcuob/0                                                        
        10 root      20   0       0      0      0 S   0.0  0.0   0:00.00 rcuob/1                                                        
        11 root      20   0       0      0      0 S   0.0  0.0   0:00.00 rcuob/2                                                        
        12 root      20   0       0      0      0 S   0.0  0.0   0:00.00 rcuob/3                                                        
        13 root      20   0       0      0      0 S   0.0  0.0   0:00.00 rcuob/4 
    

     

    2. 使用reisub
    a. REISUB简介
    Sys Rq 是一种叫做系统请求,按住 Alt-Print 的时候就相当于按住了 Sys Rq 键,这个时候输入的一切都会直接由 Linux内核来处理,它可以进行许多低级操作。这个方法可以在各种情况下安全地重启计算机。
    SysRq是Linux提供的一个“Magic System Request Key”,它可以在系统出现故障的时候协助恢复和调试系统。只要你的虚拟终端或串口还可以接收键盘输入(系统还能响应键盘的按键中断),SysRq就可用,你可以借助它来查看当时的内存、进程状态等信息,而不是直接强行拔掉电源重启系统。
    reisub        中的每一个字母都是一个独立操作,他们分别表示:

    R - 把键盘设置为 ASCII 模式
    SysRq: Keyboard mode set to XLATE
    有关键盘工作模式,请参考资料中的 kbd_mode 手册。
    
    E - 向除 init 以外所有进程发送 SIGTERM 信号
    SysRq: Terminate All Tasks
    因为 syslogd 本身也被结束,所以 SysRq 也许不会被记录下来。但是查看 /var/log/messages 会看到类似下面的消息:
    exiting on signal 15(SIGTERM)
    
    I - 向除 init 以外所有进程发送 SIGKILL 信号
    SysRq: Kill All Tasks
    与 E 类似,因为 syslogd 本身也被结束,除非 netconsole 或串口记录已打开,否则连上面的信息都无法捕捉。同时,因为 SIGKILL 是不可捕获的信号,/var/log/messages 里面也不会留下任何线索。
    
    S - 磁盘缓冲区同步
    SysRq : Emergency Sync 
     Emergency Sync complete
    该操作会把磁盘缓冲区的数据回写,以防止数据丢失,通常会有一定延时。在能看到输出的情况下,请等到 ” Emergency Sync complete ” 过后再继续后续操作。否则,等十秒钟左右,再进行后续 SysRq 操作。
    
    U - 重新挂载为只读模式
    SysRq : Emergency Remount R/O 
     Emergency Remount complete
    该操作会把磁盘重挂载为只读模式,以防止数据的损坏。与 S 类似,该操作通常也有一定延时。请等到 ” Emergency Remount complete ” 出现过后再进行后续操作,或者等候十秒钟再进行后续 SysRq 操作。
    
    B - 立即重启系统
    SysRq: Resetting
    该操作会立即重启系统

    b.要使用Magic Sysrq Key,有三个基本条件
    - 键盘上有Sysrq键
    - 系统使用的内核,在编译时打开了CONFIG_MAGIC_KEY选项

    [root@rhel7 ~]# grep -F CONFIG_MAGIC_SYSRQ /boot/config-`uname -r`
    CONFIG_MAGIC_SYSRQ=y   #表示已开启

    -系统配置Magic Sysrq Key为可用,临时启用,设置/proc/sys/kernel/sysrq

    [root@rhel7 ~]# sudo echo "1" > /proc/sys/kernel/sysrq
    
    查看 /etc/sysctl.conf,确认 kernel.sysrq = 1 
    如果先前为0,更改配置后使用以下方式激活:sysctl -p

    c.实际操作技巧
    同时按下<Alt>+<SysRq>行不通!只会蹦出来一个屏幕截图窗口。所以,真正的做法应该是:
    注:键盘上可以找到一个叫做“Sys Rq”的键,在台机的键盘上通常与 Prt Sc 共键,在笔记本可能在其他位置,如 Delete。
    (1)伸出你的左手,同时按住<Alt>键,别松开
    (2)右手先按一下<SysRq>,左手别松开
    (3)-E-I-S-U-B 这个序列的推荐使用方式是:R – 1 秒 – E – 30 秒 – I – 10 秒 – S – 5 秒 – U – 5 秒 – B

  • 相关阅读:
    js中location.href的用法
    entityframework单例模式泛型用法
    [C#]从URL中获取路径的最简单方法-new Uri(url).AbsolutePath
    等到花儿也谢了的await
    ASP.NET MVC下的异步Action的定义和执行原理
    实际案例:在现有代码中通过async/await实现并行
    ASP.NET MVC Controllers and Actions
    扩展HtmlHelper
    iOS开发网络篇—XML数据的解析
    IOS学习:常用第三方库(GDataXMLNode:xml解析库)
  • 原文地址:https://www.cnblogs.com/reid21/p/9507366.html
Copyright © 2011-2022 走看看