2741 字
7 分钟
低价 VPS 卡顿不一定是 CPU:从 iostat 延迟拆解共享磁盘与内存化取舍

先把“配置很高”拆成几个不同问题#

低价 VPS 的宣传页通常先给出 vCPU、内存和流量,但这些指标并不能直接回答一个更关键的问题:系统能否稳定完成小块随机读写。

社区公开的一则故障记录里,一台标称 2 核、5G 内存、无限流量的 VPS 出现了 IPv4 连接异常、系统更新卡住,以及 SSH 会话长时间没有响应等问题。随后使用 iostat -dx 1 观察到,虚拟块设备 vda 的写入等待约为 986.50 毫秒,discard 等待约为 6216 毫秒,队列也持续堆积。这个样本不能证明某个商家或所有低价 VPS 都存在同样问题,但它提供了一个很有价值的诊断方向:当交互式命令卡顿时,先不要把锅全部甩给 CPU 或网络。

CPU 使用率低,并不代表系统没有被拖住。进程可能正在等待块设备完成请求;SSH 只是把这种等待表现为按键无回显、命令迟迟不返回。对于包管理器、数据库、日志服务和容器镜像操作来说,随机读写延迟往往比“磁盘标称容量”更重要。

另外,材料中展示的服务页面受到 WAF 请求信息遮挡,无法从页面内容核验完整的产品承诺。因此,本文只讨论公开故障样本中的诊断与工程方法,不把社区描述写成厂商的正式性能结论。

用 iostat 区分“算不动”和“等不到”#

排查应从低侵入性的观测开始。Debian 或 Ubuntu 上可以安装 sysstat:

sudo apt-get update
sudo apt-get install -y sysstat
sudo iostat -xz 1 10

重点看以下字段,而不是只看 %util:

  • await:一次 I/O 从发出到完成的平均等待时间,通常包括排队和设备服务时间。
  • r_await、w_await:分别观察读、写请求的等待,便于判断是写回压力还是读取受阻。
  • aqu-sz:平均队列长度。持续增长通常意味着请求到达速度超过设备处理速度。
  • %util:设备有请求在处理的时间占比。它适合观察忙碌程度,但不能独立代表真实体验。
  • d_await:discard 请求的等待时间。虚拟化环境中,回收、擦除或底层存储映射操作可能产生额外延迟。

执行时要注意两点。第一,iostat 默认第一组数据可能是自开机以来的平均值,不适合直接判断当前瞬时故障;使用连续采样并观察后续行。第二,不能把一次采样中的峰值直接当成长期性能。至少记录十组以上数据,并在空闲、更新软件包、写入测试文件等不同负载下分别观察。

可以配合 vmstat 和进程级工具判断等待是否已经传导到系统:

vmstat 1 10
ps -eo state,pid,comm,wchan:32 --sort=state | head -n 30
sudo pidstat -d 1 10

如果 vmstat 中的 wa 明显升高,同时大量进程处于不可中断睡眠状态,且 pidstat 显示读写吞吐并不高,却持续消耗等待时间,问题更接近存储延迟而不是“磁盘带宽不够”。反过来,如果 CPU 长时间满载、I/O 等待不高,那么把目录搬到内存并不能解决根因。

不要在生产盘上直接运行破坏性基准测试。fio 的裸设备测试可能覆盖数据;即使测试文件方式更安全,也会制造额外写入和缓存污染。更稳妥的检查顺序是先看历史监控、应用日志、内核消息和虚拟机控制台,再决定是否做短时、限速的测试。

tmpfs 能缓解什么,不能解决什么#

当确认卡顿主要来自频繁临时写入时,可以把特定目录放到内存文件系统,而不是把整个根文件系统贸然搬进内存:

sudo mkdir -p /run/my-cache
sudo mount -t tmpfs -o size=512M,nosuid,nodev,noexec tmpfs /run/my-cache
findmnt /run/my-cache

对于 /tmp,更建议通过系统的挂载配置或发行版默认机制管理,而不是只执行一次临时 mount。临时挂载重启后会消失,且不同服务对 /tmp 的权限、粘滞位和可执行文件需求并不相同。若确实需要持久配置,先确认目录用途,再在 /etc/fstab 中写入明确的大小和安全选项,并保留回滚方案。

tmpfs 的收益来自减少底层块设备访问:缓存、构建中间文件、临时解压内容和高频日志可以在内存中完成。但它有清晰的代价:

  1. 内存被文件占用后,会与应用堆、页缓存和容器进程竞争。size=512M 是上限,不是额外获得的 512M;实际使用仍会挤压可用内存。
  2. 重启、崩溃或宿主机故障会丢失其中全部内容。任何数据库文件、上传文件、队列状态和配置都不应只放在 tmpfs。
  3. 内存盘只能减少部分写入,不能修复底层存储的读取延迟、discard 延迟、宿主机过载或网络故障。
  4. 对日志目录使用 tmpfs 可能导致排障证据一起消失。更合理的做法是只把高频、可重建的缓存放入内存,并把关键日志异步送到外部系统。

可以用下面的命令在调整前后确认实际效果,而不是凭感觉判断:

df -hT /tmp /run/my-cache
free -h
mountpoint /run/my-cache
sudo du -xhd1 /run/my-cache | sort -h

工程上的判断标准不是“SSH 变快了”,而是关键服务的可接受性是否提高,同时没有引入 OOM、缓存失效或重启后数据缺失。

容器快照适合恢复,不等于备份系统#

社区样本提出了另一种思路:用 Podman 运行 Debian 容器,停止时提交当前容器为镜像,再导出为 tar 文件,随后推送到 WebDAV;启动时下载 tar、导入镜像并重新创建容器。这种方案的核心价值不是让磁盘变快,而是把易变工作区和可恢复状态分开。

一个最小的演示流程如下:

podman run -d --name workbox debian:stable-slim sleep infinity
podman exec workbox sh -c 'printf "%s\n" ready > /root/state.txt'
podman commit workbox workbox:snapshot
podman save --format oci-archive -o workbox-$(date +%F).tar workbox:snapshot
sha256sum workbox-$(date +%F).tar

恢复时:

podman load -i workbox-2026-09-07.tar
podman run -d --name workbox-restored workbox:snapshot sleep infinity
podman exec workbox-restored cat /root/state.txt

这条链路可以保存容器文件系统层中的状态,但不能自动保证以下内容完整:挂载到容器外部的卷、数据库正在写入的事务、容器运行时的网络配置、密钥管理、定时任务、宿主机防火墙规则,以及应用所依赖的远程服务。podman commit 也不是数据库一致性快照;对 PostgreSQL、MySQL 等服务,应使用其原生备份或快照机制,并在恢复后执行校验。

导出 tar 到 WebDAV 前,至少应完成三项检查:

sha256sum workbox-2026-09-07.tar > workbox-2026-09-07.sha256
podman image inspect workbox:snapshot --format '{{.Id}}'
tar -tf workbox-2026-09-07.tar | head

远端上传成功不等于备份可用。应在另一目录或另一台机器上下载、校验哈希、执行 podman load,然后真正启动容器并检查业务数据。备份至少保留多个时间点,避免最新快照恰好包含损坏状态。若 WebDAV 凭据直接写进命令历史或脚本,恢复方案本身又会变成泄露入口,应使用权限受限的配置文件、环境变量或专用凭据管理方式。

一份更可靠的低价 VPS 验收清单#

拿到实例后,不要先部署重要业务,可以按以下顺序建立基线:

第一步,确认连接与网络路径。 分别测试 IPv4、IPv6 和管理面板,记录 SSH 端口、包过滤规则以及 DNS 解析结果。连接异常不一定是磁盘问题,端口封禁、地址信誉和上游路由也可能造成相同表象。

第二步,记录存储设备与挂载。 使用 lsblk -o NAME,TYPE,SIZE,FSTYPE,MOUNTPOINTS、findmnt 和 df -hT 确认根盘、临时盘、容器存储位置。不要只看云面板显示的“SSD”或“高性能”,要知道实际工作负载落在哪个挂载点。

第三步,做非破坏性观察。 在低负载时采集 iostat -xz 1 60,再执行一次小规模的软件包索引更新,比较 await、队列长度和系统 wa。不要把一次短暂尖峰直接判为永久超售,也不要因平均值正常而忽略周期性卡顿。

第四步,建立恢复路径。 重要配置放入版本控制,应用数据使用独立备份,容器镜像与运行时状态分离。tmpfs 只承载可重建内容;任何快照都必须有下载、校验、导入、启动和业务检查步骤。

第五步,设置退出条件。 如果在空载或轻载下仍出现持续数百毫秒级的 I/O 等待、更新任务频繁卡死、数据库无法完成检查点,继续堆叠缓存技巧通常不如迁移到更稳定的存储。省下的月租不能抵消人工排障、数据恢复和服务中断成本。

结论:把“优化”分成减压、恢复与迁移#

低价 VPS 的问题不能用一个参数解释。tmpfs 属于减压:它适合把可重建的高频临时写入挡在内存里,但会消耗 RAM 并放大数据丢失风险。Podman 导出属于恢复:它可以把某些容器状态封装成可搬运文件,却不能替代数据库一致性备份和宿主机配置管理。更换实例或服务商才是迁移:当底层存储持续提供不了可接受的延迟,应用层再聪明的缓存也只是延后故障。

因此,验收 VPS 时最值得记录的不是“有几核、几 G”,而是三个可复核结果:在目标负载下 I/O 等待是否稳定、关键数据是否能从独立备份恢复、当性能越过阈值时是否有明确迁移方案。把这三项写进部署清单,才算真正把廉价资源纳入工程控制,而不是把“配置表”误当成可靠性承诺。

参考资料#

分享

如果这篇文章对你有帮助,欢迎分享给更多人!

低价 VPS 卡顿不一定是 CPU:从 iostat 延迟拆解共享磁盘与内存化取舍
https://blog.katelya.top/posts/diagnose-vps-storage-latency/
作者
Katelya
发布于
2026-09-07
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时

相关文章 智能推荐
1
免费 VPS 不是福利,而是一套资源回收与分发系统:从 PolarNode 预约页看云厂商的边界设计
DevOps 免费 VPS 的本质并不是“送机器”,而是一种资源分发与生命周期管理方案。本文从 PolarNode 预约页和运营规则出发,拆解它如何用预约顺序、邀请增长与自动回收来控制成本、稀缺性与用户留存。
2
自建 AI 访问链路:从 VPS 代理到 API 端点路由的工程实践
DevOps 面对中转站服务不稳定与成本波动,本文基于社区实践与平台架构,拆解通过 VPS 代理与 sub2api 工具构建本地 AI 访问链路的完整方案。文章涵盖 Incus NAT VPS 选型、3xui/AIMILIVPN 隧道部署、sub2api 协议转换配置,以及混合路由策略的工程取舍与成本分析。
3
NAT VPS 不是迷你独服:从 Incus 容器边界拆解 1C/128M 低价实例的真实能力
技术实践 低价 NAT VPS 的关键从来不只是 CPU、内存和流量数字,而是实例到底处在什么网络与隔离边界中。本文以材料中明确标注“基于 Incus”的平台为线索,结合社区公开的 1C、128M、512M 磁盘与 500G 流量样本,拆解 NAT 实例的地址模型、资源限制、可验证能力与失败边界,并给出一套不依赖宣传页的检查清单。
4
TypeSafe 注册流程重构与自动化工程实践:从邀请制到全链路协议注册
DevOps TypeSafe (Jev/System One) 近期取消了邀请制,将注册流程从 7 步缩减为 4 步。本文基于官方 GitHub 仓库的提交记录与开源脚本,分析其协议重构细节,探讨基于 Python 的全链路自动化实现(单线程 6 秒至多线程 0.12 秒的吞吐量提升),以及 Remail 与 CF Worker 邮箱基础设施在账号批量创建中的工程价值与失败边界。
5
全球拨测的工程边界:从宝塔拨测的节点响应与故障定位看运维监控的演进
DevOps 本文基于宝塔拨测官方文档与社区公开信息,深入剖析其全球多节点监控架构。从 Ping/TCP/DNS/SSL 的协议层响应数据出发,探讨如何利用路由追踪与异常告警重构运维工作流,并分析在成本与覆盖面之间的工程取舍。

目录