Ich habe einen fprintf
Anruf, der für unangemessene 10 Sekunden blockiert, wenn das System IO beschäftigt ist, aber immer noch viel CPU hat. Ich weder setvbuf
des zugrunde liegenden Stream noch öffnete die zugrunde liegende FD mit O_DIRECT
. Dies bedeutet, dass der Stream sowohl den Status-Stream als auch den System-Cache hat.Wie kann fprintf in Linux blockieren?
Ich kann nicht sagen, wie ein fprintf
Anruf für so lange Zeit blockiert werden kann. Für den schlechtesten Fall, in dem der Strompuffer des zugrundeliegenden Streams voll ist, denke ich, dass die libc einfach write(2)
aufruft, um den Pufferinhalt auf Platte zu schreiben. Aber nach meinem Wissen wird write(2)
auf einem FD, das nicht mit O_DIRECT
geöffnet ist, nicht auf die Plattenübertragung warten, d. H. Es ist asynchron zu Platten-IO. Die einzige zeitraubende Arbeit, die ich mir vorstellen kann, ist der Kernel, der den Cache für die geschriebenen Daten reserviert, aber das scheint keine 10-Sekunden-Arbeit zu sein, selbst wenn das System zu wenig Speicher hat. Tatsächlich verfügt das System über zehn MB freien Arbeitsspeicher und mehrere GB Arbeitsspeicher im Cache.
Gibt es einen Ratschlag?
Danke.
Wie groß ist die Größe der übertragenen Daten? – ascobol
Ungefähr 100 Bytes habe ich gerade Log geschrieben. – Utoah
nicht mit o_direct zu öffnen bedeutet nicht, dass es schnell fertig sein würde .. es kann zum Beispiel mit cache/lock contention handeln. –