タグ

ブックマーク / blogs.itmedia.co.jp/komata (2)

  • Linux:カーネルまで含めたプロファイルの取り方:プログラマー社長のブログ:オルタナティブ・ブログ

    UNIX系OSでプログラミングをしていて、性能面で悩んだときには、gprofというプロファイラを使うと、簡単にプログラム中の関数呼び出し回数や関数実行時間などを測定することができます。gccのオプションに-pgをつければ良いだけということでとても簡単で便利です。 ところが、gprofで測定できるのは、あくまでもプログラム自体の処理だけで、カーネルやドライバまで含めた測定はできません。 このところ、ネットワークプログラムの10Gイーサーでの性能向上をしているのですが、10Gクラスになるとプログラム自体の処理はもちろんですが、カーネル内の処理やデバイスドライバでの処理もかなり大きな影響がでてきます。特に、ネットワークでの通信は、ネットワークデバイスでの出入りは並列化できなかったり、パケットの順序を入れ替えられないことがほとんどなど、どれだけCPUが並列処理に強くなっても、ネットワーク関連の処理

    Linux:カーネルまで含めたプロファイルの取り方:プログラマー社長のブログ:オルタナティブ・ブログ
  • TCP/IPでsend()を繰り返す際に気をつけると良いこと:プログラマー社長のブログ:オルタナティブ・ブログ

    久しぶりにネットワークプログラミングネタで。 TCP/IPをソケットインターフェースで使う際に、通信相手側が切断したかどうかはrecv()で受信したときにゼロが戻ることで判断するのは誰もが知っていることですが、send()で送信する際にも、1回目にはエラーにならなくても2回目には大抵エラーになることでわかるということも知っていると思います。 たとえば、HTTPサーバを作るとすると、送受信部分は下記のような感じに書くでしょう。 ループ{ recv()でリクエストを受信 if(recv()のリターン値がゼロか-1){ break; } send()で応答を送信:応答を送りきるまで } 大抵はこれで問題ないのですが、高負荷時にはこれだとカーネルが不機嫌になることがわかりました。。 send()で大きなサイズを送信する場合、クライアント側が途中で切断してしまうことがあり、基的にはsend()が-

    TCP/IPでsend()を繰り返す際に気をつけると良いこと:プログラマー社長のブログ:オルタナティブ・ブログ
  • 1