Qtを介してアプリケーションを開発しています。
このアプリケーションでは、メインスレッドはWebサーバーです。別のスレッドが大きなファイル(250mb)からデータを読み取り、それらを出力ファイル(〜2gb)に書き込むことがあります。
このスレッドはファイルに対して高いI/O操作を実行し、CPU iowaitは約70%です。
私の問題は、ファイルに書き込むときに、Webサーバーが迅速に応答しないことです。私が理解したのは、サーバーのqtソケット(Linuxの場合)は、ポーリングまたは選択イベントシステムに接続されたシステムソケットによって表されるということです。したがって、Qtは、ポーリングがイベントを発行したときにのみ、アプリケーションにシグナルを送信します。
私が思うに、ファイル書き込みを伴う巨大なio操作は、ポーリングシステムをブロックする可能性があるため、qtサーバーはソケットイベントを受信しません。スレッドがデータの書き込みを終了すると、すべてが正常になります。
ファイルの書き込みは次のようになります。
while(dataToRead){
// context has the list of files to read and current step
dataToRead = extractData(context, &pBuffer, &sizeBuf);
fwrite (pBuffer, 1, sizeBuf, pOutFile);
free(pBuffer);
pBuffer = NULL;
// usleep(100000);
}
usleep関数で休憩を追加すると、問題を回避するのに役立ちますが、十分な睡眠を使用しない場合は完全には役立ちません。しかし、スリープが長すぎるとパフォーマンスが低下し、私は可能な限り高速に生成されたファイルでした。
私が間違っているのは何ですか?できるだけ速くファイルの読み取り/書き込みを行うのは安全ですか?上記の機能でスリープは必須ですか?しかし、どうすれば良いタイムスライスを知ることができますか?
私はMintLMDE、Linux 3.2.0 64ビット、Intel Corei52500および標準HDDドライブに取り組んでいます。
編集:問題を再現するサンプルプログラムは、https ://bugreports.qt-project.org/secure/attachment/30436/TestQtBlocked.zipから入手できます。コンパイルするにはqtのqmakeが必要です。これを実行すると、空の3GBファイルが作成され、起動時にワーカースレッドが起動され、数秒でファイルが作成されます。この間にhttp:// localhost:8081 /に接続しようとし、F5を何度も実行してページを更新すると、応答が速くない場合があります。誰かが私のサンプルプログラムで私の問題を再現できれば役立つかもしれません、そして私に知らせてください。