programing:linux-programing:linux-cpu-core-shield
差分
このページの2つのバージョン間の差分を表示します。
両方とも前のリビジョン前のリビジョン次のリビジョン | 前のリビジョン最新のリビジョン両方とも次のリビジョン | ||
programing:linux-programing:linux-cpu-core-shield [2022/10/20 16:48] – yoko | programing:linux-programing:linux-cpu-core-shield [2022/10/25 12:47] – [CPU Affinityの一覧表示] yoko | ||
---|---|---|---|
行 3: | 行 3: | ||
リアルタイム性が要求されるネットワーク通信を含むプログラムなど、さまざまなイベントに応答する際にレイテンシーを最小限に抑える必要がある。 | リアルタイム性が要求されるネットワーク通信を含むプログラムなど、さまざまなイベントに応答する際にレイテンシーを最小限に抑える必要がある。 | ||
これを行う為に、割り込み (IRQ) とさまざまな CPU 上のユーザープロセスを相互に分離する手法について備忘録を残す。 | これを行う為に、割り込み (IRQ) とさまざまな CPU 上のユーザープロセスを相互に分離する手法について備忘録を残す。 | ||
+ | |||
+ | 尚、シールドモデルの考え方など下記の資料が参考になる。 | ||
+ | |||
+ | {{https:// | ||
+ | |||
プロセスのCPUコア分離 | プロセスのCPUコア分離 | ||
行 68: | 行 73: | ||
<code bash> | <code bash> | ||
$ cat / | $ cat / | ||
+ | CPU0 | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | ... | ||
</ | </ | ||
行 82: | 行 93: | ||
$ cat / | $ cat / | ||
</ | </ | ||
- | |||
### スクリプトによる IRQ への CPU アフィニティーの自動割り当て | ### スクリプトによる IRQ への CPU アフィニティーの自動割り当て | ||
- | `smp_affinity`の指定は、再起動した時には元に戻るので、下記のようなPerlスクリプトを実行して自動設定するようにする。 | + | `smp_affinity`の指定は、再起動した時には元に戻るので、下記のようなPerlスクリプトを実行して自動設定する。 |
<code perl irq_shield.pl> | <code perl irq_shield.pl> | ||
行 96: | 行 106: | ||
my $infile = "/ | my $infile = "/ | ||
- | my $nicname = " | + | my $nicname = " |
my $mode = 0; # 動作モード | my $mode = 0; # 動作モード | ||
行 105: | 行 115: | ||
if ($ARGV[1] eq " | if ($ARGV[1] eq " | ||
$mode = 1; | $mode = 1; | ||
+ | } | ||
+ | if ($ARGV[1] eq " | ||
+ | $mode = 2; | ||
} | } | ||
} | } | ||
行 111: | 行 124: | ||
while ( <IN> ) { | while ( <IN> ) { | ||
- | | + | |
- | my @a = split(); | + | my @a = split(); |
- | $a[0] =~ s/: | + | $a[0] =~ s/: |
- | if ($mode == 1) { | + | if ($mode == 0) { |
- | system(" | + | print; |
+ | } | ||
+ | else { | ||
+ | if ($mode == 1) { | ||
+ | system(" | ||
+ | } | ||
+ | print "echo c > / | ||
+ | } | ||
} | } | ||
- | print "echo c > / | ||
- | } | ||
} | } | ||
行 125: | 行 143: | ||
</ | </ | ||
+ | |||
+ | 上記スクリプトを管理者権限で実行する。 | ||
+ | |||
+ | <code bash> | ||
+ | $ sudo ./ | ||
+ | </ | ||
+ | |||
+ | |||
+ | その他 | ||
+ | ----- | ||
+ | |||
+ | ### CPUに負荷をかける | ||
+ | stressコマンドで、CPUのコア# | ||
+ | |||
+ | <code bash> | ||
+ | $ taskset -c 2 stress -c 1 | ||
+ | </ | ||
+ | |||
+ | ### CPU負荷状況の確認 | ||
+ | 下記コマンドでCPUの負荷状況を表示。 | ||
+ | |||
+ | <code bash> | ||
+ | $ dstat -c -C 0,1,2,3 | ||
+ | -----cpu0-usage----------cpu1-usage----------cpu2-usage----------cpu3-usage---- | ||
+ | usr sys idl wai stl:usr sys idl wai stl:usr sys idl wai stl:usr sys idl wai stl | ||
+ | 5 | ||
+ | | ||
+ | | ||
+ | 9 | ||
+ | 9 | ||
+ | | ||
+ | | ||
+ | 9 | ||
+ | | ||
+ | | ||
+ | | ||
+ | </ | ||
+ | ### CPU Affinityの一覧表示 | ||
+ | CPU Affinityを一覧表示するPerlスクリプト。 | ||
+ | |||
+ | <code perl cpu_pslist.pl> | ||
+ | # | ||
+ | # | ||
+ | # CPU affinityの一覧を表示する。 | ||
+ | # | ||
+ | |||
+ | use strict; | ||
+ | use warnings; | ||
+ | |||
+ | my @result; | ||
+ | my $mode = 0; | ||
+ | |||
+ | if (@ARGV >= 1) { | ||
+ | if ($ARGV[0] eq " | ||
+ | $mode = 1; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | if ($mode == 0) { | ||
+ | @result = `ps aux`; | ||
+ | } | ||
+ | else { | ||
+ | @result = `ps auxf`; | ||
+ | } | ||
+ | |||
+ | foreach my $line(@result) | ||
+ | { | ||
+ | my @a = split(/ | ||
+ | |||
+ | if ($a[1] eq " | ||
+ | print "AFFIN " . $line; | ||
+ | } | ||
+ | else { | ||
+ | my $affi = `taskset -pc $a[1] 2>& | ||
+ | if ($? == 0) { # コマンド実行のリターンコード | ||
+ | my @b = split(/ | ||
+ | my $str = sprintf(" | ||
+ | print $str . $line; | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | </ | ||
行 144: | 行 244: | ||
13. [[https:// | 13. [[https:// | ||
14. [[https:// | 14. [[https:// | ||
- | 15. {{https:// | + | 15. [[https:// |
+ | 16. {{https:// | ||
programing/linux-programing/linux-cpu-core-shield.txt · 最終更新: 2022/10/25 13:09 by yoko