Armadillo-IoT G3/Armadillo-IoT G3L/Armadillo-X1ではi.MX7DというデュアルコアのCPUを搭載しています。通常、あるプロセスがどのCPUコアで実行されるかは、Linuxカーネルの判断次第なのですが、プロセスごとにアフィニティ(親和性)の設定を行うことで、どのコアで実行して欲しいかをLinuxカーネルへ指定することができます。
tasksetというコマンドでアフィニティの設定が行えます。本記事では、実行例と共に使用方法を紹介します。
前提条件
「指定したコアで実行されているか」の確認として各コアへの負荷を確認します。コア毎の負荷を確認する際にhtopというコマンドを使用しますので、本記事を参考にされる際はインストールして下さい。
例) htopコマンドのインストール
[armadillo ~]# apt-get install htop
また、htopコマンドはtopコマンドと同様に、ターミナル画面を占領します。htopでコアの使用状況を確認しながらコマンドを実行するために、シリアルコンソールの他に、sshでログインします。そのため、ArmadilloへOpenSSH Serverもインストールしておいて下さい。
例) OpenSSH Serverのインストール
[armadillo ~]# apt-get install openssh-server
アフィニティの設定例
実行例は以下のスクリーンショットの通りです。手前のウィンドウではArmadilloへSSHで接続し、htopを実行しています。左上の"1"・"2"がCPUの各コアの負荷を表しています。裏側のウィンドウではシリアルで接続したコンソール上で操作を行っています。
まず、CPUへ負荷をかけるスクリプトを作成し、実行しています(スクリーンショットへ書き込んだコメントの通りです)。
その後、tasksetコマンドを実行しています。tasksetコマンドは"-p"オプションでPIDを指定したプロセスのアフィニティを確認できます。
tasksetコマンドは「アフィニティマスク」というビットフィールドでアフィニティ設定を扱います。分かり難いので、2つ目に実行しているtasksetコマンドでは"-c"オプションをつけて分かりやすくしています。"-c"オプションではアフィニティ設定をCPUコア番号のリストで表示します(番号は0始まり)。スクリーンショットの例の場合、0番と1番のCPUコアが共にアフィニティとして設定されていることがわかります。
そして、htopで表示しているCPU負荷情報から、結果的にLinuxカーネルは、負荷スクリプトを1番(htopの画面では2番)のCPUコアで実行させていることが分かります。
ここでは、tasksetコマンドで0番(htopの画面上では1番)のCPUコアで実行するようにアフィニティ設定を変えています。"taskset -c -p 0 886"というコマンドがアフィニティ設定を変更するコマンドです。"-p"オプションの直後にCPUコア番号(今回の場合"0")を指定することでアフィニティ設定を変更できます。
そして、htopの画面でCPUコア番号0番(htopの画面上では1番)の負荷が上がっており、負荷スクリプトがCPUコア0番で実行されていることが分かります。