CPUソフト割り込み&ケーススタディing
2415 ワード
1ケース
1.1環境配置
環境1:WEBサーバ
docker run -itd --name=nginx -p 80:80 nginx
環境2:SYN攻撃
curl http://xxx.xxx.xxx.xxx/
Welcome to nginx!
...
# -S TCP SYN( ),-p 80
# -i u100 100
# : , 100 , 10 1
$ hping3 -S -p 80 -i u1 xxx.xxx.xxx.xxx
1.2分析プロセス
1、CPU使用率は高くないがソフト割り込みは10%に達し、非idle状態のすべてからソフト割り込みに使用されている.
2、どのソフトブレークによる問題なのか確認する
watch -d cat /proc/softirqs
TIMER(タイミング割り込み)、NET_RX(ネットワーク受信)、SCHED(カーネルスケジューリング)、RCU(RCUロック)では、ネットワーク受信の変化が最も速い.
3、ネットワークの問題を確認し、引き続きネットワーク送受信パケットの状況を観察する
# -n DEV , 1
sar -n DEV 1
報告時間|NIC|rxpck/s txpck/s送受信フレーム数|exkB/s txkB/s送受信KB数
5955.00*1024Byte/112924.00=54Byte
の平均パケット当たり54バイト、すなわちパケット問題を計算する.4、バッグの確認問題
tcpdump -i eth0 -n tcp port 80
21:59:25.549573 IP .40615 > .http: Flags [S], seq 270293337, win 512, length 0
21:59:25.549592 IP .40616 > .http: Flags [S], seq 830767629, win 512, length 0
Flags[S]はsynパケットを表し、PPSは1.2 Wを超えてsyn flood攻撃を確認する.
2コンセプト
2.1ソフトブレーク概念
linuxの割り込みはCPUの現在の作業を中断し、割り込みは一般的に設計されている短くて精悍です.しかし、Linuxの割り込みは、割り込みハンドラの実行時間が長すぎることと、割り込みが失われていることの問題を解決するために、2つの段階に分けられます.
NIC受信パケットの例:
ネットワークカードはパケットを受け取るとハードウェアが中断する方式で、カーネルに新しいデータが届いたことを通知します:上半部にとって、高速処理である以上、実はネットワークカードのデータをメモリに読み込んで、それからハードウェアレジスタの状態(データが読めたことを示す)を更新して、最後にもう一つのソフト中断信号を送って、下半部にさらなる処理を行うことを通知します.後半部がソフト割り込み信号で起動すると、メモリからネットワークデータを見つけ、ネットワークプロトコルスタックに従ってアプリケーションに送るまで、データを階層的に解析し、処理する必要があります.
実際には,前半部でCPUが実行中のタスクを中断し,直ちに割り込み処理プログラムを実行する.一方、下半部以内のコアスレッドの方式は実行され、CPUごとに1つのソフトブレークカーネルスレッドに対応し、名前は「ksoftirqd/CPU番号」であり、例えば、0番のCPUに対応するソフトブレークカーネルスレッドの名前はksoftirqd/0である.ただし、ソフト割り込みには、前述したハードウェアデバイス割り込み処理プログラムの後半部だけでなく、カーネルスケジューリングやRCUロック(Read-Copy Updateの略、RCUはLinuxカーネルで最も一般的なロックの1つ)など、カーネルカスタマイズされたイベントもソフト割り込みに属していることに注意してください.
2.2ソフトブレークとカーネルスレッドの表示
cat /proc/interrupts
ソフトブレークcat /proc/softirqs
ハードブレーク