我正在 Linux 中开发一个应用程序,其中包括从多个线程仅追加写入文件。目前,我正在从每个线程获取互斥锁,然后附加到文件。我想优化应用程序的性能,并考虑创建多个文件(让我们调用段),然后每个线程可以只写入自己的段。该文件类似于预写日志,仅在应用程序启动期间使用。
我想知道上面是否是一个优化 IO 的好策略。
在同一本地磁盘上创建多个文件进行写入是否有任何开销?
答案1
从man 2 write
:
根据 POSIX.1-2008/SUSv4 第 XSI 2.9.7 节(“线程与常规文件操作的交互”):
当以下所有函数在常规文件或符号链接上操作时,在 POSIX.1-2008 中指定的效果中,彼此之间应是原子的:...
随后列出的 API 包括 write() 和 writev(2)。跨线程(和进程)应该具有原子性的影响之一是文件偏移量的更新。然而,在 3.14 版本之前的 Linux 上,情况并非如此:如果共享打开文件描述(请参阅 open(2))的两个进程同时执行 write()(或 writev(2)),则 I /O 操作在更新文件偏移量方面不是原子操作,因此两个进程输出的数据块可能(错误地)重叠。这个问题在 Linux 3.14 中得到了修复。
换句话说,如果这只是一个进程中的多个线程,那么没有问题,如果您的内核 > 3.14;这与实际的文件系统无关。