Red Hat Training
A Red Hat training course is available for RHEL 8
34.7. アプリケーション読み取りソケットバッファーのボトルネックの特定
TCP アプリケーションが読み取りソケットバッファーを十分な頻度でクリアしない場合、パフォーマンスが低下し、パケットが失われる可能性があります。Red Hat Enterprise Linux は、このような問題を特定するためのさまざまなユーティリティーを提供します。
34.7.1. 受信バッファーのコラプシングとプルーニングの特定
受信キュー内のデータが受信バッファーサイズを超えると、TCP スタックはソケットバッファーから不要なメタデータを削除して、スペースを解放しようとします。このステップはコラプシングとして知られています。
コラプシングが追加のトラフィック用に十分なスペースを解放できない場合、カーネルは着信する新しいデータをプルーニングします。これは、カーネルがメモリーからデータを削除し、パケットが失われることを意味します。
操作のコラプシングとプルーニングを回避するには、TCP バッファーのコラプシングとプルーニングがサーバー上で発生するかどうかを監視し、この場合は TCP バッファーをチューニングします。
手順
nstat
ユーティリティーを使用して、TcpExtTCPRcvCollapsed
カウンターとTcpExtRcvPruned
カウンターをクエリーします。# nstat -az TcpExtTCPRcvCollapsed TcpExtRcvPruned #kernel TcpExtRcvPruned 0 0.0 TcpExtTCPRcvCollapsed 612859 0.0
しばらく待ってから、
nstat
コマンドを再実行します。# nstat -az TcpExtTCPRcvCollapsed TcpExtRcvPruned #kernel TcpExtRcvPruned 0 0.0 TcpExtTCPRcvCollapsed 620358 0.0
最初の実行と比較してカウンターの値が増加している場合は、チューニングが必要です。
-
アプリケーションが
setsockopt(SO_RCVBUF)
呼び出しを使用している場合は、それを削除することを検討してください。この呼び出しでは、アプリケーションは呼び出しで指定された受信バッファーサイズのみを使用し、サイズを自動チューニングするソケットの機能をオフにします。 -
アプリケーションが
setsockopt(SO_RCVBUF)
呼び出しを使用しない場合は、TCP 読み取りソケットバッファーのデフォルト値と最大値をチューニングします。
-
アプリケーションが
受信バックログキューを表示します (
Recv-Q
)。# ss -nti State Recv-Q Send-Q Local Address:Port Peer Address:Port Process ESTAB 0 0 192.0.2.1:443 192.0.2.125:41574 :7,7 ... lastrcv:543 ... ESTAB 78 0 192.0.2.1:443 192.0.2.56:42612 :7,7 ... lastrcv:658 ... ESTAB 88 0 192.0.2.1:443 192.0.2.97:40313 :7,7 ... lastrcv:5764 ... ...
ss -nt
コマンドを、各実行の間に数秒の待ち時間を設けて複数回実行します。出力の
Recv-Q
列に高い値が 1 件だけリストされている場合、アプリケーションは 2 つの受信操作の間にありました。ただし、lastrcv
が継続的に増加する一方で、Recv-Q
の値が一定のままである場合、またはRecv-Q
が時間の経過とともに継続的に増加する場合は、次の問題のいずれかが原因である可能性があります。- アプリケーションはソケットバッファーを十分な頻度でチェックしません。この問題の解決方法の詳細は、アプリケーションのベンダーにお問い合わせください。
アプリケーションは十分な CPU 時間を取得できません。この問題をさらにデバッグするには、以下を実行します。
アプリケーションが実行されている CPU コアを表示します。
# ps -eo pid,tid,psr,pcpu,stat,wchan:20,comm PID TID PSR %CPU STAT WCHAN COMMAND ... 44594 44594 5 0.0 Ss do_select httpd 44595 44595 3 0.0 S skb_wait_for_more_pa httpd 44596 44596 5 0.0 Sl pipe_read httpd 44597 44597 5 0.0 Sl pipe_read httpd 44602 44602 5 0.0 Sl pipe_read httpd ...
PSR
列には、プロセスが現在割り当てられている CPU コアが表示されます。- 同じコア上で実行されている他のプロセスを特定し、それらを他のコアに割り当てることを検討してください。