下载文本文件并将其写入 tmpfs 比写入磁盘慢,为什么?

下载文本文件并将其写入 tmpfs 比写入磁盘慢,为什么?

我有一个名为 tmpfs /rtmp/,在 Ubuntu 操作系统上为其分配了 1GB RAM。

我正在使用 bash 脚本进行测试,看看使用将小文本文件写入硬盘是否更快,或者写入此 RAM 驱动器是否更快/rtmp/

Bash 脚本写入硬盘

#!/bin/bash

URL="http://some.website/some.txt"

wget -O ~/current/axis_tmp ${URL}

cat ~/current/axis_tmp | grep "^pattern" | tail -n 1 | awk -F',' '{printf("%.0f\n", $3)}' | sed 's/ //g' > ~/current/tmp.txt

sed -i 's/^/X,/' ~/current/tmp.txt
sed -i 's/$/,Y/' ~/current/tmp.txt

exit 0

Bash 脚本写入 tmpfs

#!/bin/bash

URL="http://some.website/some.txt"

wget -O /rtmp/axis_tmp ${URL}

cat /rtmp/axis_tmp | grep "^pattern" | tail -n 1 | awk -F',' '{printf("%.0f\n", $3)}' | sed 's/ //g' > /rtmp/tmp.txt

sed -i 's/^/X,/' /rtmp/tmp.txt
sed -i 's/$/,Y/' /rtmp/tmp.txt

exit 0

运行time命令后,我得到以下结果:

写入磁盘

real    0m0.554s
user    0m0.022s
sys     0m0.003s

写入 tmpfs

real    0m0.614s
user    0m0.023s
sys     0m0.002s

为什么写入文本文件比将tmpfs文件写入磁盘慢?处理时间不应该是快点写信给tmpfs

答案1

您的脚本不是测试 I/O 的正确方法。作为哈迪尔布指出其中一些,还有更多。这就是为什么有专门的工具来实现这一点。恕我直言,最好的工具可能是fio。你可以这样尝试

fio --name=fio-rand-write --rw=randwrite --bs=4k --direct=0 --numjobs=4 \
--size=512M --ioengine=libaio --iodepth=16

您只需cd转到要测试的分区中的文件夹,例如/rtmp并启动命令。请随意阅读其文档或其他线程以获取更多信息。

答案2

脚本在完成所请求的工作之前/之后做了很多工作(这里写了一些数据):需要启动 shell 程序(大概已经在内存中,没什么大不了的),初始化其数据区域,定位,读取并解释启动文件(.bashrc.bash_profile在您的家里,系统范围的文件,...),读取并解释其中给出的命令,读取并解释脚本中的命令,依次运行调用的程序,撕裂之后的一切都放下了。您测量的主要是开销,而不是工作本身。

Shell 用于直接用户交互,并且具有一些基本的编程设施(我经常编写一行代码,例如一次性处理多个文件),您也可以编写更实质性的程序(只要性能不那么重要)这可以)。但对于严肃的脚本编写,最好使用专为该任务设计的语言,例如 Python、Perl 或 Raku。这两种脚本替代方案都不是进行严格基准测试的正确工具。至少在没有大量护理的情况下是这样。

相关内容