为什么 Ubuntu 在大规模网络、磁盘 I/O 时速度很慢?

为什么 Ubuntu 在大规模网络、磁盘 I/O 时速度很慢?

不确定从哪里开始,但是我在我的 Ubuntu Hardy 上不断看到这个奇怪的问题。

系统是 Core i7-920,配有 RAID10 磁盘和 3GB RAM,不过这可能不是重点。它上面有多个 Samba 共享。每次有人将大型文件(多个 GB)上传到共享时,系统响应能力就会显著下降(很明显)。

文件系统:ReiserFS (v3)

vmstat 和 top 均显示 I/O 等待时间不长,阻塞进程很少(例如 4 核系统中只有 2 个),偶尔会将 ~13000 个块写入磁盘。平均负载始终低于 0.5(再次说明,系统为四核且启用了 HT,因此有 8 个逻辑核心)。

但是,即使我移动鼠标光标,它也严重滞后......

以下是大量网络 I/O 传入期间的典型 vmstat 输出:

vmstat -n 1
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa
 1  0 419268  93724  48052 2071148    0    0     9     3   11    4  1  1 95  2
 1  0 419268  91560  48052 2073292    0    0     0     0 2396 5716  5  1 94  0
 0  0 419268  89636  48056 2075164    0    0     0     0 2173 5537  2  1 97  0
 2  0 419268  87836  48056 2077136    0    0     0     0 2057 5216  1  1 98  0
 1  0 419268  85716  48060 2078812    0    0     0 10104 2108 5261  2  1 97  0
 0  0 419268  91940  48060 2071748    0    0     0     0 2221 6153  2  1 97  0
 2  0 419268  90368  48064 2073640    0    0     0     0 2104 5384  1  1 98  0
 0  0 419268  89000  48064 2075092    0    0     0     0 1781 4700  1  1 98  0
 1  0 419268  87140  48064 2076640    0    0     0     0 2045 5104  1  1 98  0
 1  1 419268  85584  48068 2078240    0    0     0 10112 1945 4343  2  1 91  7
 0  0 419268  92668  48068 2071764    0    0     0    16 2064 5197  2  1 96  1

答案1

您可以尝试使用 IO 调度程序。默认的 IO 调度程序是 CFQ,它对于台式机来说效果很好,但根据我的经验,对于文件服务器来说 Deadline 效果更好。您可以随时更改 IO 调度程序,以便轻松进行试验,看看哪种调度程序最适合您的情况。

要列出可用的 io 调度程序,请使用此命令。

cat /sys/block/sdb/queue/scheduler  

这应该返回noop anticipatory deadline [cfq]

要将您的调度程序更改为截止时间,请在相应的设备上使用以下命令。

sudo echo "deadline" > /sys/block/sdb/queue/scheduler

答案2

尝试运行iotop- 它应该会向你显示一些东西。

答案3

正常运行期间,您是否看到过那么多中断(System - in)和上下文切换(System - cs)?我很奇怪,因为您描述甚至鼠标光标都变慢了。如果存在导致系统在负载下被中断淹没的问题,这将导致一切都变慢。

只是为了进行全面的猜测,/var/log/dmesg 中是否有关于磁盘或 raid 设备的错误或超时的信息?

编辑1:

我今天早上偶然看到一篇文章,它听起来确实像您在机器上看到的问题。Greg Smith 分析了一台似乎长时间冻结磁盘写入的服务器。他特别的调查方法是运行以下命令:

while [ 1 ]; do cat /proc/meminfo; sleep 1; done

并在系统似乎挂起之前和期间查看“Writeback:”缓存大小。如果写回缓存确实已填满(大约已满 40% 以上)并导致系统在刷新时暂停写入,那么 Greg 建议进行一些操作系统调整,以缓解此问题。Greg 的博客文章可以在以下网址找到:http://notemagnet.blogspot.com/2008/08/linux-write-cache-mystery.html

答案4

我想说的是,ReiserFS 只有一个锁,因此并不适合大型(多磁盘)磁盘阵列。但时间已经过去很久了,所以我可能是错的。

我认为改变调度程序会有很大帮助。

相关内容