Linux 多线程写入磁盘与使用互斥体写入内存

Linux 多线程写入磁盘与使用互斥体写入内存,linux,mutex,hard-drive,Linux,Mutex,Hard Drive,我有一个多线程代码,需要从不同的线程写入日志。为了提高效率,我设置了一个内存块,让线程通过互斥同步写入。然而,我做了一个简单的测试,似乎拧到硬盘也很快。我正在使用linux。不确定连接到硬盘的速度是否真的更快,还是我做错了什么?您可能有系统缓冲区缓存效应,隐藏了磁盘IO的实际成本,因此 这两个测试之间没有区别。这还取决于您现在使用的文件系统的类型。例如,ext4fs支持所谓的“惰性”编写。您可以通过传递到装载选项来切换此选项 data=writeback. 这意味着文件的元数据可以在写入文件

我有一个多线程代码,需要从不同的线程写入日志。为了提高效率,我设置了一个内存块,让线程通过互斥同步写入。然而,我做了一个简单的测试,似乎拧到硬盘也很快。我正在使用linux。不确定连接到硬盘的速度是否真的更快,还是我做错了什么?

您可能有系统缓冲区缓存效应,隐藏了磁盘IO的实际成本,因此
这两个测试之间没有区别。

这还取决于您现在使用的文件系统的类型。例如,ext4fs支持所谓的“惰性”编写。您可以通过传递到装载选项来切换此选项

data=writeback. 

这意味着文件的元数据可以在写入文件后延迟写入。这不会导致文件系统损坏,但可能会导致在崩溃时丢失最新的更改(因此您可能会稍微回到过去)。因此,对磁盘的真正写入将被推迟。您的测试可能不太正确。

要绕过缓冲区缓存,如果您所在的文件系统支持O_DIRECT open标志,则可以使用O_DIRECT open标志。这意味着对于具有写缓存的现代硬盘驱动器,您不必像我那样努力创建同步内存缓冲区。我的答案不是关于磁盘缓存,而是关于系统缓存。我倾向于对你最后的评论回答是肯定的,这取决于你拥有的内存量对不起,我有点困惑,设计自己的同步缓冲区有好处吗?如果没有,我将只写磁盘,因为它只是日志文件,如果磁盘/系统将其保存在缓冲区中,而不首先进行真正的写入,这也没关系。谢谢,这是否意味着如果我为ext4 fs打开写缓存,那么,创建一个需要花费大量精力的同步内存缓冲区会很快,而且没有任何好处?POSIX文件API非常明确地规定,在调用fsync()之前,不能保证数据在磁盘上。问题在于,应用程序假定他们可以忽略规范所说的内容,只是因为在他们测试的文件系统上,它似乎总是可以正常工作。所以,至少,每次写入光盘时,您可以在测试中运行fsync()。