サーバーがときどきクラッシュし始めるので、dmesg
を確認しました。そこで私は次の行を読みました:
perf interrupt took too long (2528 > 2500), lowering kernel.perf_event_max_sample_rate to 50000
数回表示されます。
perfがパフォーマンス分析ツールであることを覚えており、インストールしたことを覚えていません。だから私はチェックしました:
~$ dpkg -l *perf*
dpkg-query: no packages found matching *perf*
私の質問:
rcu_sched detected stalls
で始まるスタックダンプがあるためこのメッセージはLinuxカーネルからのものです。より正確には perf_duration function
linux/kernel/events/core.c
:
static void perf_duration_warn(struct irq_work *w)
{
printk_ratelimited(KERN_INFO
"perf: interrupt took too long (%lld > %lld), lowering "
"kernel.perf_event_max_sample_rate to %d\n",
__report_avg, __report_allowed,
sysctl_perf_event_sample_rate);
}
私はあなたが正確に何を意味するのかわかりません:
これは嵐の兆候ですか?
しかし、私はあなたのデバイスの1つに問題を疑っています。
PS:注意深く読むと、コードにメッセージがperf: interrupt took too long
ですが、メッセージはperf interrupt took too long
。コロンはカーネルバージョン4.6で追加されました。
しばらくの間、デスクトップシステムに同様のメッセージが表示されました。無停電ディスクI/O(D
内のps
)で1つまたは複数のコアが数分以上ストールした後に表示されます。デッドロックにつながるI/Oスケジューリングの競合状態が疑われますが、これをデバッグする方法がわかりません。 CFQの代わりに適切なディスクのデッドラインスケジューラに切り替えると役立つようです。
# echo deadline > /sys/block/sdX/queue/scheduler
私はそれを使ってスケジューリングの短い一時停止を観察しましたが、デッドラインスケジューラの2番目のキューは長いストールを軽減するようです。
誰かがこれについてもう少し光を当てることができれば、私もそれを感謝します。
編集
rcu_sched
エラー/警告が関連しているかどうかはわかりませんが、可能性は十分にあります。カーネルの設定が異なるため、取得できません。
1つのコアが停止している場合、ps
で表示されるのは
$ ps axu | grep ' D'
dirk 4720 13.0 5.1 1615772 842444 pts/3 Dl+ 07:27 24:54 iceweasel -P default
i/Oを行っていたプロセスのために。 D
は、man ps
によると、「割り込み不可能なスリープ(通常はI/O)」を意味します。