我正在 S3 读/写上运行一些非常基本的时间命令。问题是,我不希望它受到系统IO的影响,并且想从内存中对其进行测试。一位朋友建议使用 /dev/null 作为管道,但我有一个包含 1000 个文件的文件夹,大小约为 1GB。
我的 bash 命令现在看起来像这样:
time aws s3 cp folder s3://mybucket/folder
你有什么建议,只对内存中的写入进行计时?
非常感谢
答案1
将目录复制到 ramdisk,从那里上传(和测试)。
什么虚拟盘?有几个选项:
也许您的操作系统中已经有一个并且它的大小足够大。检查
df
(更方便的是:df -h
,如果支持的话)类型文件系统的输出tmpfs
。可能是/dev/shm
。我希望/dev/shm
它是世界可写的,所以如果它是一个虚拟磁盘并且它不是太小,那么你就可以使用它。可能有一个专门供您的用户使用的单独的 ramdisk。看这个文件夹是什么
/run/user/1000
?在我的 Debian 或 Kubuntu 中,df -h "$XDG_RUNTIME_DIR"
我可以确认它是 tmpfs,了解它的大小和挂载点。这个答案给出了如何按需创建 tmpfs 的示例(大小为 16 GiB,根据您的需求和资源进行调整):
mount -o size=16G -t tmpfs none /mnt/tmpfs
您需要 root 访问权限才能执行此操作。
有这样一个问题:tmpfs 的大小由什么决定?满了会发生什么?你可能会觉得很有趣。
作为替代方案,您可以使用vmtouch
读取目录中的所有文件并映射到虚拟内存中。如果我是你,我会更喜欢 ramdisk。不过,如果由于某种原因您无法使用 ramdisk,那么最好了解一下vmtouch
可以做什么。
作为普通用户,您可以使用vmtouch -t
:
-t
触摸虚拟内存页面。从文件的每一页读取一个字节。如果该页面未驻留在内存中,则会生成页面错误,并且该页面将从磁盘读取到文件系统的内存缓存中。
-t
可能还不够:
注意:虽然保证每个页面都已放入内存,但在命令
vmtouch
完成时该页面可能会从内存中逐出。
作为 root 您可以使用vmtouch -l
:
-l
将页面锁定到物理内存中。此选项的工作原理与此相同,-t
只是它调用mlock(2)
所有内存映射并且完成后不关闭描述符。爬行结束时,如果成功,vmtouch 将无限期阻塞。文件将被锁定在物理内存中,直到vmtouch
进程被终止。