当系统 IO 忙但仍有大量 CPU 时,我有一个fprintf
呼叫阻塞了大约 10 秒。我既没有setvbuf
底层流也没有打开底层 fd O_DIRECT
。这意味着流同时具有 stdio 流和系统缓存。
我不知道一个fprintf
电话怎么会被阻止这么长时间。对于底层流的流缓冲区已满的最坏情况,我认为 libc 只是调用write(2)
将缓冲区内容写入磁盘。但据我所知,write(2)
在未打开的 fd 上O_DIRECT
不会等待磁盘传输,即它对于磁盘 IO 是异步的。所以我能想到的唯一耗时的工作是内核为写入的数据分配缓存,但这似乎不是一个 10 秒的工作,即使系统内存不足。实际上,系统有几十 MB 的空闲内存和几 GB 的缓存内存。
有什么建议吗?
谢谢。