我试图解决的问题是保存大量(数百万)小文件(最多50KB),这些文件通过网络发送。保存按顺序完成:服务器接收文件或目录(通过网络),将其保存在磁盘上;下一个到达,它被保存等。 显然,如果多个服务器进程共存,那么性能是不可接受的(假设我有5个进程都从网络中读取并同时写入),因为I / O调度程序无法有效地合并I / O写入。
建议的解决方案是实现某种缓冲:每个服务器进程应该有一个50MB的缓存,它应该写入当前文件,执行chdir等;当缓冲区已满时,应将其同步到磁盘,从而获得I / O突发。
我向你提问: 1)我知道已经存在缓冲机制(磁盘缓冲区);你认为上述情况会增加一些改进吗? (设计要复杂得多,实现简单的测试用例并不容易)
2)你有什么建议吗,在哪里查看我是否会实现这个?
非常感谢。
答案 0 :(得分:1)
你需要做得比
更好“显然表现不可接受”。
具体地
为了进行优化,您需要两件事 - 一种测量它的方法(一个度量)和一个目标(这样您就知道何时停止,或者特定技术是多么有用或无用)。
如果没有,你会沉没,我很害怕。
答案 1 :(得分:0)
这些写作有多重要?我有三个建议(可以合并),但其中一个是很多工作,其中一个不太安全......
我猜你看到一些糟糕的表现,部分归因于大多数现代Linux文件系统常见的journaling。在写入文件元数据时,日记会导致插入IO队列的障碍。您可以尝试使用mount(8)
选项barrier=0
和data=writeback
来降低安全性(可能提高速度)。
但如果发生崩溃,期刊可能无法阻止冗长的fsck(8)
。在修复问题时,fsck(8)
可能会丢弃您的数据。一方面,这不是一个轻松的步骤,另一方面,在过去,我们以ext2
模式运行我们的async
文件系统,没有在雪中的两个方向记录我们喜欢它。
另一种可能性是交换IO电梯;请参阅Linux内核源代码树中的Documentation/block/switching-sched.txt
。简短版本是deadline
,noop
,as
和cfq
可用。 cfq
是内核默认值,可能是您的系统正在使用的内容。你可以查看:
$ cat /sys/block/sda/queue/scheduler
noop deadline [cfq]
文件中最重要的部分:
As of the Linux 2.6.10 kernel, it is now possible to change the
IO scheduler for a given block device on the fly (thus making it possible,
for instance, to set the CFQ scheduler for the system default, but
set a specific device to use the deadline or noop schedulers - which
can improve that device's throughput).
To set a specific scheduler, simply do this:
echo SCHEDNAME > /sys/block/DEV/queue/scheduler
where SCHEDNAME is the name of a defined IO scheduler, and DEV is the
device name (hda, hdb, sga, or whatever you happen to have).
The list of defined schedulers can be found by simply doing
a "cat /sys/block/DEV/queue/scheduler" - the list of valid names
will be displayed, with the currently selected scheduler in brackets:
# cat /sys/block/hda/queue/scheduler
noop deadline [cfq]
# echo deadline > /sys/block/hda/queue/scheduler
# cat /sys/block/hda/queue/scheduler
noop [deadline] cfq
更改调度程序可能是值得的,但是根据日记记录要求插入队列的障碍,可能没有太多重新排序。尽管如此,它不太可能丢失您的数据,因此这可能是第一步。
另一种可能性是将应用程序彻底更改为捆绑文件本身,并将更少,更大的文件写入磁盘。我知道这听起来很奇怪,但是(a)iD开发团队将他们的地图,纹理,对象等打包成巨大的zip
文件,他们会通过一些系统调用读取程序,解压缩并运行因为他们发现性能比阅读几百或几千个较小的文件要好得多。级别之间的加载时间大大缩短。 (b)Gnome桌面团队和KDE桌面团队采用不同的方法来加载他们的图标和资源文件:KDE团队将他们的许多小文件打包成某种更大的软件包,而Gnome团队却没有。 Gnome团队的启动延迟时间更长,并希望内核可以做出一些努力来改善他们的启动时间。内核团队一直在建议更少,更大的文件方法。
答案 2 :(得分:0)
创建/重命名文件,同步文件,在目录中包含大量文件并拥有大量文件(尾部浪费)是您的方案中的一些缓慢操作。但是为了避免它们,它只会有助于编写较小的文件(例如写出档案,连接文件或类似文件)。我实际上会尝试(有限的)并行异步或同步方法。 IO调度程序和缓存通常非常好。