FreeBSD カーネル options ALTQ_NOPCC

ALTQを有効にしようと思ったのだが、そういえばHTでない本当のマルチコアでしかもSMP有効なカーネルでALTQを使うのは初めて。

俺の結論としては 「トラフィック過多でパフォーマンスに問題発生しない限り options ALTQ_NOPCC は設定する」 である。

man altq をすると以下のような記述がある。

ALTQ_NOPCC  Required if the TSC is unusable.

この部分、かつてはSMPの時に必要という記述だったのだが、TSCが使えない場合に必要なオプションという記述である。

で sysctl で調べてみると、 以下のようになっている

% sysctl -a |fgrep -i tsc
kern.timecounter.choice: TSC(-100) ACPI-fast(1000) i8254(0) dummy(-1000000)
kern.timecounter.tc.TSC.mask: 4294967295
kern.timecounter.tc.TSC.counter: 3008106847
kern.timecounter.tc.TSC.frequency: 2992511889
kern.timecounter.tc.TSC.quality: -100
kern.timecounter.smp_tsc: 0
machdep.tsc_freq: 2992511889

kern.timecounter.smp_tsc: 0 がとても気になって追ってみた。 /usr/src/sys/i386/i386/tsc.c のコメントに以下のようなものがある。

We can not use the TSC in SMP mode unless the TSCs on all CPUs are somehow synchronized.  Some hardware configurations do this, but we have no way of determining whether this is the case, so we do not use the TSC in multi-processor systems unless the user indicated (by setting kern.timecounter.smp_tsc to 1) that he believes that his TSCs are synchronized.

SMPの場合、TSCの値が同期せずに問題が発生することがあるということだ。kern.timecounter.smp_tsc は同期してくれるシステムである場合に限って、管理者が手で1に設定するためのカーネル変数である。

これを手掛かりに検索するとAMD Dual-Core Optimizer (NyaRuRuの日記) といったものが見つかる。上記のtsc.c内のコメントと合わせると、BIOS等で同期させるような処理が入るシステムが存在するようだ。一方で今回のハードウェアでTSCを同期してくれるかどうかは実験してみない限り分からない。

そもそも options ALTQ_NOPPC が行う処理を調べると /usr/src/sys/contrib/altq/altq/altq_subr.c において以下のようになっている。

  • nooptions ALTQ_NOPPC : 直接x86命令 RDTSC を利用してTSCから値を読む
  • options ALTQ_NOPPC : microtime システムコールを利用し、値を TSC が取る値の範囲に変換する

誤動作するよりは少し遅い方がシステムとしてはマシである。少なくとも処理が追いついているのであれば。

という訳で FreeBSD7ではSMPがデフォルト有効であり、今後はマルチコアCPUが標準になるであろうことも考慮に入れると、最初に書いたように ALTQ を利用する際には options ALTQ_NOPCC は設定しておく方がよいだろう。

ちなみに amd64カーネルだといずれにせよ RDTSC を使わないので関係はない。amd64 で ALTQ 使えるのかどうかも未確認であるが…

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。