公众号旧文

服务器安装大型软件卡死了,怎么办?

作者:胖子阅读 —

本文从下面这张阿里云后台截图开始,聊聊安装大型软件怎么避免卡死。

图片

故事还要从安装 Dify 说起:

前天,我在一台2核2G的服务器上,尝试安装 Dify。

结果刚开始安装,终端就卡死了。

阿里云后台,磁盘读写异常活跃。

从 17:40 左右开始,读取突然暴涨。

随后长时间维持在 70MB/s ~ 100MB/s 附近。

而且不是瞬间,是持续几十分钟。

一、为什么安装软件会疯狂读盘?

因为现代软件安装,早就不是复制几个文件。

尤其是 Docker 环境。

当你执行:

docker compose up

服务器就马上开始:

  • 拉取镜像
  • 解压镜像 layer
  • 创建 overlay2
  • 初始化数据库
  • 安装 Python 依赖
  • 创建 node_modules
  • 校验文件完整性

这些操作会产生海量小文件读写。

而 Linux 最怕的恰恰就是随机 IO。

二、为什么 SSH 也会跟着卡?

明明只是安装软件,为什么连 SSH 都进不去了?

因为 SSH 本身也依赖磁盘。

例如:

  • bash 历史记录
  • 用户配置
  • PAM
  • systemd
  • shell 环境
  • 日志

都需要读写硬盘。

于是当 Docker 疯狂抢 IO 时,sshd 也得排队。

于是看到的现象就是:

  • SSH 卡顿
  • 输入延迟
  • 新连接超时
  • 系统像死机

但实际上内核很可能还活着。

只是所有进程都在等硬盘。

三、Linux 一种很经典的状态:没死,但谁都动不了。

CPU 可能才 20% 到 30%,内存也没爆。

但磁盘已经 100%。

于是所有进程都卡在:

D 状态(不可中断 IO 等待)

换句话说就是:大家都在排队等硬盘。

这也是为什么很多时候 ping VPS 还能通。

四、这时候最忌讳什么?

估计很多人会和前天的我一样,立刻强制重启。

但正确的做法是先观察。

比如:

1. Ping 还通不通

如果 ping 还能通,就说明内核大概率还活着。

2. 后台监控还动不动

虽然 SSH 卡住,但如果磁盘曲线还在变化。

就说明系统还在工作。

3. CPU 是否完全归零

如果:

  • CPU 还有波动
  • IO 还在跑
  • 网络还有流量

那么通常只是系统忙疯了,而不是服务器死机了。

五、那如何不卡死呢?

我的思路很简单:

只要别让服务器资源跑到物理极限,那就自然不会卡死了。

于是在安装大型软件时,可以这样:

ionice -c3 nice -n 19 docker compose up

其中 nice -n 19,是降低 CPU 优先级。

而 ionice -c3,会降低磁盘 IO 优先级。

因为真正把 SSH 拖死的,很多时候不是 CPU,而是磁盘 IO。

代价只是安装慢一点。

但换来的却是:

  • SSH 不容易卡死
  • VPS 不容易失联
  • 系统更稳定

这俩参数,对于低配服务器安装大型软件来说,几乎是必须的。