记录一次解决服务器卡顿问题的经过

记录两次解决服务器卡顿问题的过程。之前遇到都是直接重启机器或者重置服务器,没有认真考虑过原因,折腾完这两次以后突然觉得应该记录一下,后续在遇到这些情况不至于只知道重启/重装。

情况一:硬盘空间不足

  • 检查磁盘空间
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    # df -h
    Filesystem Size Used Avail Use% Mounted on
    udev 422M 0 422M 0% /dev
    tmpfs 91M 10M 81M 12% /run
    /dev/vda3 40G 39G 0 100% /
    tmpfs 452M 0 452M 0% /dev/shm
    tmpfs 5.0M 0 5.0M 0% /run/lock
    tmpfs 452M 0 452M 0% /sys/fs/cgroup
    /dev/vda2 189M 6.1M 182M 4% /boot/efi
    overlay 40G 39G 0 100% /var/lib/docker/overlay2/2cef17a9bba0b6ad0829ffb0a3e4053e99b9a7203e1d709fd8f56bcb2f7d3d75/merged
    overlay 40G 39G 0 100% /var/lib/docker/overlay2/8fc17c4d69466dd8f93d14e965dbb921ecfa97033c0c463ab78dc3d633e9acbe/merged
    tmpfs 91M 0 91M 0% /run/user/0

很明显总共40G的小硬盘已经可用容量已经为零了,急需清理一些磁盘出来。其中嫌疑最大的就是docker了。

  • 重点清理对象

    1
    2
    3
    4
    5
    docker system prune -a  # 删除所有未使用的容器、镜像、网络

    # 清理日志文件
    journalctl --disk-usage
    journalctl --vacuum-time=7d # 只保留7天日志
  • 顺便清理一些临时文件日志文件

    1
    2
    3
    4
    5
    6
    7
    8
    # 清理临时文件
    rm -rf /tmp/*
    rm -rf /var/tmp/*

    # 快速清理一些空间
    apt-get autoremove
    apt-get autoclean
    rm -rf /var/log/*.gz /var/log/*.old
  • 后续
    一通操作,果然腾出了12G的空间出来(主要是docker占用),SFTP又变的丝滑了,ssh也不卡了。

情况二:僵尸进程

  • 检查系统资源占用
    1
    2
    3
    4
    5
    6
    top - 11:10:26 up 98 days,  1:14,  1 user,  load average: 45.39, 25.04, 24.50
    Tasks: 6277 total, 2 running, 124 sleeping, 0 stopped, 6151 zombie
    %Cpu(s): 1.4 us, 38.4 sy, 0.0 ni, 0.0 id, 59.2 wa, 0.0 hi, 0.9 si, 0.0 st
    MiB Mem : 903.6 total, 53.4 free, 765.0 used, 85.1 buff/cache
    MiB Swap: 0.0 total, 0.0 free, 0.0 used. 23.7 avail Mem
    ## 后边省略若干行

分析发现三个异常,load average过高,6151个僵尸进程,wa过高,初步判断是因为僵尸进程太多占用了大量的进程表空间,所以系统资源竞争激烈。

  • 查找僵尸进程的源头
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    /# ps -eo ppid | sort | uniq -c | sort -rn | head -10
    6151 989827
    65 2
    31 1
    8 989394
    6 20956
    5 1548830
    2 989842
    2 989836
    2 989706
    2 520

罪魁祸首已经很明显了,就是989827这个进程,创建了六千多个僵尸进程

  • 定位问题源头
    1
    2
    3
    /# ps -fp 989827
    UID PID PPID C STIME TTY TIME CMD
    root 989827 989706 0 Oct27 ? 00:14:57 registry serve /etc/docker/xxx/config.yml

现在问题已经很明显了,是我前天搞了一半的docker,当时着急下班没有完全调通,中间一天没顾上看,结果一直重试差点把服务器给搞崩了。。。

  • 后续
    关掉重试了两天的服务以后,卡顿情况接触。