目次
単純な書き込み
- ソケットへのデータの書き込みには
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
コメントをどうぞ