Working with TCP Sockets 読書メモ 第5章 データの書き込みとバッファリング

目次


単純な書き込み

  • ソケットへのデータの書き込みにはwriteメソッドを使用する
require 'socket'

Socket.tcp_server_loop(4481) do |connection|
  connection.write('Welcome!')
  connection.close
end

バッファリング

  • writeを実行して、正常に結果が返ってきたからといって、書き込みが成功したとは限らない
  • OSのカーネルによってデータが処理可能な状態になったことが保証されるだけ
  • カーネルが、データをすぐに送信するか、まとめて送信するかを決定する

なぜバッファリングするのか?

  • パフォーマンス向上のため
  • ネットワーク越しのデータ送信は遅いので、できるだけ回数を減らしたい

たくさんの小さなwriteと、1つの大きなwriteではどちらが望ましいか?

  • 一般的には、一度に全てを書き込むと最良のパフォーマンスが得られる
  • ただし、メモリに載らないような巨大なデータやファイルは分割すべき

読み込みのバッファリング

  • readに読み込みの最大長を渡すと、最大長を超える部分はバッファリングされる

読み込みのサイズはどの程度にすべきか?

  • カーネルは、readの読み込みに指定したサイズのメモリを確保する
  • サイズが大きすぎると、リソースの無駄が多くなる
  • サイズが小さすぎると、システムコールの呼び出し回数が増える
  • どの程度のサイズが適切かは、プログラムが取り扱うデータのサイズによって異なる
  • 著名なRubyライブラリでの設定値は以下
    • 16KB: Mongrel, Unicorn, Puma, Passenger, Net::HTTP
    • 1KB: redis-rb

ディスカッションに参加

3件のコメント

コメントをどうぞ

コメントを残す