カーネルパラメータ
- net.core.rmem_max
- net.core.wmem_max
と、
sqlnet.ora(またはtnsnames.ora)に指定する以下のオプション
- SEND_BUF_SIZE
- RECV_BUF_SIZE
両方ともTCP受信/送信バッファの最大値を設定するパラメータとあり、SEND_BUF_SIZE/RECV_BUF_SIZEを設定する意義がわからなかったので、検証してみた。
結論からいうと、[SEND|RECV]_BUF_SIZEの設定有無にかかわらずnet.core.[r|w]membmaxを上限にWindowサイズが自動調整された。ただし、[SEND|RECV]_BUF_SIZEを指定した場合は、設定した値までWindowサイズがどんどん増加していく。net.core.[r|w]membmaxのみの場合は、ある程度のサイズで収束する。
検証環境
環境1
- OEL 6.10 (UEK4)
- DB 11.2.0.4 (環境2へDBリンク)
環境2
- CentOS 6.10
- DB 11.2.0.4
環境1と環境2の間でDBリンクを張る。環境1と環境2の間のレイテンシ(ping応答時間)は30ms程度
環境1にSQL*Plusでログインし、環境2のテーブルをDBリンクを使用してSelectする。
環境2側で、tcpdumpを取得し、Windowサイズの変化を見る。
結果
赤線が設定なし。青線がRECV_BUF_SIZEを1MBに設定。オレンジがRECV_BUF_SIZEを2MBに設定した場合のWindowサイズの変化。RECV_BUF_SIZEを設定した場合は、初期値は一緒だけど、指定した値までどんどん上昇していくのがわかる。
windowサイズは、tcpdumpのwin列に2のwscale乗をかけた値で算出。wscaleはスリーウェイ・ハンドシェイクからキャプチャしないと値を取得できないので注意