私は 4 コア ARM CPU 上で Linux アプリケーションを開発しています。アプリケーションには 2 つのプロセスがあり、以下のように各プロセスを CPU に割り当てました。
- コア1 : プロセス1 (GUI)
- core2-4 : precess2 (リアルタイムアプリケーション)
プロセス1がなければ、プロセス2は簡単にそのプロセスを処理できるので、心配する必要はありません。しかし、問題は、プロセス1を実行すると、プロセス2のパフォーマンスに大きな影響を与え、プロセス2がまったく正常に動作しないことです。
これにはどのような理由があるのでしょうか?
追加情報:
cpu2-4はisolcpus=1-3で分離されています。
システム全体のスレッドをトレースしたところ、プロセス 1 があるときのみ、プロセス 2 が core1 で rcu_preempt と呼ばれる多数のタスクを起動していることに気付きました。ただし、これら 2 つのプロセスはメモリを共有しません。
プロセス 1 を他のプロセスに置き換えたところ、割り当てられたメモリに大量のデータを急速に書き込むプロセスがプロセス 2 に影響を与えることがわかりました。単純な CPU 作業 (while ループなど) を実行するプロセスは影響しません。
答え1
すべての CPU を乗っ取ったため、Linux カーネルは自身のスレッドを実行するために実行中のプロセスをプリエンプトすることになります。カーネルは CPU を区別せず、CPU1 を他の CPU と同様にプリエンプトできます。コンピューター内で発生するアクティビティが増えるほど、カーネルは CPU を区別せずにさらに多くのプリエンプトを行う必要があります。
さらに、CPU がすべてではなく、コンピューターのアーキテクチャには、さらに暗黙のボトルネックが存在する場合があります。その一部はメモリ バンクで、バンクへの同時アクセスはそのバンクへのチャネル数に依存します。さらに、コンピューターのメモリ バス、ディスク キャッシュ、ディスク自体などがあります。
この記事には、リアルタイムプロセスを実行するためのヒントがさらにいくつか記載されています。 Linux でリアルタイム アプリケーションを実行するにはどうすればよいでしょうか? ただし、何がより良く機能するか、または何がより悪く機能するかを決定するのは、実際のハードウェアです。