我有一个 VPS 服务器(WiredTree),运行 CentOS。
遇到一些性能问题后,我使用以下脚本创建了一个简单的磁盘读/写速度基准:
echo Write to disk
dd if=/dev/zero of=test1 bs=1048576 count=2048
echo Read from disk
dd if=test1 of=/dev/null bs=1048576
以下是示例输出:
[bizwayz@host perf]./benchmark
Write to disk
2048+0 records in
2048+0 records out
2147483648 bytes (2.1 GB) copied, 11.2601 seconds, 191 MB/s
Read from disk
2048+0 records in
2048+0 records out
2147483648 bytes (2.1 GB) copied, 0.789302 seconds, 2.7 GB/s
[bizwayz@host perf]./benchmark
Write to disk
2048+0 records in
2048+0 records out
2147483648 bytes (2.1 GB) copied, 3.69129 seconds, 582 MB/s
Read from disk
2048+0 records in
2048+0 records out
2147483648 bytes (2.1 GB) copied, 0.789897 seconds, 2.7 GB/s
[bizwayz@host perf]./benchmark
Write to disk
2048+0 records in
2048+0 records out
2147483648 bytes (2.1 GB) copied, 9.56615 seconds, 224 MB/s
Read from disk
2048+0 records in
2048+0 records out
2147483648 bytes (2.1 GB) copied, 0.882664 seconds, 2.4 GB/s
[bizwayz@host perf]./benchmark
Write to disk
2048+0 records in
2048+0 records out
2147483648 bytes (2.1 GB) copied, 3.52512 seconds, 609 MB/s
Read from disk
2048+0 records in
2048+0 records out
2147483648 bytes (2.1 GB) copied, 0.784007 seconds, 2.7 GB/s
我的问题是写入速度比读取速度慢很多是否正常。
答案1
您正在运行 VPS 服务器。这意味着您的物理机器上还有其他客户端,它们使用磁盘的方式会影响您看到的读写性能。
通常,在 RAID10 上,写入速率约为读取速率的一半。但是,由于存在许多未知变量,可能会有另一个客户端对磁盘进行大量写入,这就是写入速度变慢的原因。
向他们开一张票不会有什么坏处,但是对于 VPS,你通常会看到这种情况。VPS 是为了方便和价值,而不是为了性能。
编辑:可以肯定,缓存在这里是一个问题,但我的观点仍然适用。
确保将 dd 命令与 fdatasync 命令一起运行,以确保它实际上将文件数据刷新到磁盘而不是仅仅刷新到内存(这是内核默认执行的操作)。即:
dd bs=1M count=512 if=/dev/zero of=test conv=fdatasync
答案2
是的,这是正常的。您的文件只有 2GB 左右,完全可以放入缓存中。实际上,它从未从磁盘读取,只是从缓存中读取。将文件大小至少放大 10 倍才能获得任何有意义的结果,甚至更多,具体取决于您的 RAM 大小(2 倍 RAM 是一个不错的起点)。
我真的很想拥有一个读取速度为 2.7 GB/s 的磁盘:)
答案3
您的测试技术中的一个问题是 Linux 中的内部系统缓冲被利用,从而极大地扭曲了您的结果。
一般来说,磁盘写入当然比磁盘读取慢。在逻辑文件级别,写入可能会慢得多,因为存在 (1) 磁盘分配过程、(2) 更新目录信息...等等。因此,当发生文件级别写入时,操作更多,它不是一个简单的原子操作,可轻松与文件级别读取操作进行比较。
在基准测试中,您需要在测试的每个 dd 之间清除缓冲区缓存....或者在每个步骤之间重新启动机器 :-)。顺便说一句,我相信有一个简单的方法可以做到这一点,即通过向适用的 /proc 区域写入一些内容。
编辑:清除缓存的过程:
sync && echo 3 > /proc/sys/vm/drop_caches
您应该在每个 dd 命令之前执行此操作。