fprintf
システムが IO ビジーでありながら CPU が大量にある場合、約 10 秒間不当にブロックされる呼び出しがあります。基になるストリームもsetvbuf
、基になる fd を で開いたこともありませんO_DIRECT
。これは、ストリームに stdio ストリームとシステム キャッシュの両方があることを意味します。
fprintf
どうすればこんなに長い間通話がブロックされるのかわかりません. write(2)
基になるストリームのストリーム バッファがいっぱいになるという最悪のケースでは、libc は単にバッファの内容をディスクに書き込むために呼び出すだけだと思います。しかし、私の知る限り、write(2)
で開かれていない fdO_DIRECT
では、ディスク転送を待機しません。つまり、ディスク IO に関しては非同期です。したがって、時間のかかる作業は、書き込まれたデータに対してカーネルがキャッシュを割り当てることだけだと思いますが、システムがメモリ不足の場合でも、これは 10 秒の作業とは思えません。実際、システムには数十 MB の空きメモリと数 GB のメモリがキャッシュされています。
何かアドバイスはありますか?
ありがとう。