
Ubuntu日本語フォーラム

ログインしていません。
こちらからの派生です。表記のCPUの割り込み処理について、教えてください。
https://forums.ubuntulinux.jp/viewtopic … 708#p70708
私の保有しているcubeマシン(MEGA651 MS-6760:SiS651+Sis962)の場合、
Ubuntu10.04LTS
~$ cat /sys/devices/system/clocksource/clocksource0/available_clocksource
tsc acpi_pm
~$ dmesg | grep clocksource
[ 0.168113] Switching to clocksource tsc
[ 0.330514] Switching to clocksource acpi_pm
~$ dmesg | grep HPET
~$ dmesg | grep PIT
[ 0.000000] Fast TSC calibration using PIT
となり、HPETが存在しません。
"コンシューマ機のマザーボードにはまだ HPET が搭載されていないことも多く、
従来の Programmable Interval Timer = PIT によってタイマ割り込みを発生させることが多いようです。"
そこで別の機種(ASUS P4V8X-MX)に導入したUbuntu10.04(Linux 2.6.32-25-generic-pae)
で検証してみました。このマザーボードはHPETが機能する仕組みがあるようです。
でも、こちらも最初は同様な結果でしたが、違う箇所は
~$ dmesg | grep HPET の結果です。
boot optionに "hpet=force"を設定すればよいと表示されました。
そこで、~$ gksu gedit /etc/default/grub にて、オプションを追加してみました。
....
GRUB_CMDLINE_LINUX_DEFAULT="quiet hpet=force"
....
grubに反映させるため
~$ gksudo update-grub を実行して、再起動しました。
その結果です。
~$ cat /sys/devices/system/clocksource/clocksource0/available_clocksource tsc hpet acpi_pm ~$ dmesg | grep clocksource [ 0.240281] Switching to clocksource tsc ~$ dmesg | grep HPET [ 0.207521] pci 0000:00:11.0: Force enabled HPET at 0xfed00000 [ 0.235235] HPET: 3 timers in total, 0 timers will be used for per-cpu timer ~$ dmesg | grep PIT [ 0.000000] Fast TSC calibration using PIT
clocksourceにhpetを指定する方法は、実際どのように行うのでしょうか。。。
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"に、clocksource=hpet を追記で
支障ないのでしょうか。。。
また、HPETが機能した場合そのメリットは。。。
オフライン
詳しくはありませんが、http://www2.nict.go.jp/w/w114/tsp/resea … ttime.htmlを見つけました。
マルチコアCPUがこんなところまで影響し、HPETカウンタをチップセットの方へ作っているのかと、感心します。
オフライン
当方の状況
(Linux ubuntu 2.6.35-22-generic-paeJ , Gigabyte EP45-DS4, Bios HPET enable)
si@ubuntu:~$ cat /sys/devices/system/clocksource/clocksource0/available_clocksource
hpet acpi_pm
si@ubuntu:~$ dmesg | grep clocksource
[ 0.392015] Switching to clocksource tsc
[ 0.451124] Switching to clocksource hpet
オフライン
funatofawaさん 紹介されたURL(時刻取得関数の仕組みについて)の情報ありがとうございました。
tscからhpetへの推移背景が何となく理解できました。
hpetがtscに比較して格段に性能がよいとのこと。
ただし、チップセットにあるHPETのカウンタをI/O命令で参照するため、オーバヘッドが大きく、
マイクロ秒以下の計測には適していない。 このことから、CPUの性能も重要なことも判明しました。
siさん hpetがbiosレベルで採用されているマザーの情報ありがとうございます。
私の保有する機種(ASUS P4V8X-MX)は、biosではサポートされていないのですが、設定は可能なようです。
これらのことから、hpetが利用可能かはマザー・ボードに依存し、3種類あることが分かりました。
1. hpetが機能しないもの
2. 起動時にオプションとしてhpetを選択指定できるもの
3. biosレベルでhpetを指定できるもの
オフライン
追記
biosでは設定する機能はないが、私のサーバ機であるLinux ubuntu 2.6.32-25-generic-pae,
MSI-865GM2, Pentium4 3.2GHz, 3GB, NVIDIA Geforce6600 AGP
について、
~$ cat /sys/devices/system/clocksource/clocksource0/available_clocksource
tsc hpet acpi_pm
~$ dmesg | grep clocksource
[ 0.260099] Switching to clocksource tsc
の結果でした。
/etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT="quiet clocksource=hpet" と変更して、再起動すると。。。
~$ dmesg | grep clocksource
[ 0.000000] Kernel command line: BOOT_IMAGE=/vmlinuz-2.6.32-25-generic-pae root=UUID=d3ecd877-6bdc-4771-b2d2-1c9a8f93e39d ro quiet clocksource=hpet
[ 0.260099] Switching to clocksource hpet
~$ dmesg | grep HPET
[ 0.237220] pci 0000:00:1f.0: Force enabled HPET at 0xfed00000
[ 0.256378] HPET: 3 timers in total, 0 timers will be used for per-cpu timer
となり、hpetでの機能になったようです。
オフライン
koisan1949様
clocksourceに関してはlapicをハンドリングするであろうACPIにより動作が一様ではありません。
多くのIntel系CPU及びchipsetではACPI内部でlapic_timer_reliable_statesをcallし、起動初期は主にacpi_idleによって割込みを制御します。
その後、仮にintel_idleがヒットした場合はacpi_idleからintel_idleへswitchすることでhpetが有効になります
(まぁdmesgのタイムスタンプ通りの処理を解説しただけですが・・)。
serial等で外部からtiming triggerを入れてrealtime kernelを動作させるような場合でない限り、overhead on I/Oはさほど問題にはならないような気がします
(あくまで”気がする”というだけで、あまり明確な根拠はありませんです・・・)。
tistaさん コメントありがとうございます。
さて、#1 のつづきです。
koike による投稿:
clocksourceにhpetを指定する方法は、実際どのように行うのでしょうか。。。
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"に、clocksource=hpet を追記で
支障ないのでしょうか。。。
cubeマシン(MEGA651) : ASUS-P4V8X-MX
Pentiam4 2.6GHz, 1GB, NVIDIA Geforce6200 AGP
Linux ubuntu 2.6.32-25-generic-pae
/etc/default/grub を編集
GRUB_CMDLINE_LINUX_DEFAULT="quiet hpet=force clocksource=hpet"
~$ gksudo update-grub を実行して、再起動した結果です。
~$ cat /sys/devices/system/clocksource/clocksource0/available_clocksource tsc hpet acpi_pm ~$ dmesg | grep clocksource [ 0.000000] Kernel command line: BOOT_IMAGE=/boot/vmlinuz-2.6.32-25-generic-pae root=UUID=0abead39-eb1c-436d-9b88-a2625ca499a2 ro quiet hpet=force clocksource=hpet [ 0.236106] Switching to clocksource hpet ~$ dmesg | grep HPET [ 0.203493] pci 0000:00:11.0: Force enabled HPET at 0xfed00000 [ 0.231141] HPET: 3 timers in total, 0 timers will be used for per-cpu timer
オフライン
#7 の訂正
cubeマシン(MEGA651) : ASUS-P4V8X-MX → ASUS-P4V8X-MX
隣にあるマシンの仕様と一部が重なりました。すみません。
オフライン
#7 の続きです。
dmesgの内容を検索するのに、"HPET"ではなく "hpet"に指定してみました。
~$ dmesg | grep hpet [ 0.000000] Kernel command line: BOOT_IMAGE=/boot/vmlinuz-2.6.32-25-generic-pae root=UUID=0abead39-eb1c-436d-9b88-a2625ca499a2 ro quiet hpet=force clocksource=hpet [ 0.231514] hpet clockevent registered [ 0.231531] hpet0: at MMIO 0xfed00000, IRQs 2, 8, 0 [ 0.231544] hpet0: 3 comparators, 32-bit 14.318180 MHz counter [ 0.236117] Switching to clocksource hpet [ 0.340422] rtc0: alarms up to one year, y3k, 114 bytes nvram, hpet irqs
~$ gksu gedit /etc/ntp.conf でNTP serverの箇所に追記しました。
# You do need to talk to an NTP server or two (or three).
server ntp.nict.jp
server ntp.nict.jp
server ntp.ubuntu.com
~$ ntpq -p
remote refid st t when poll reach delay offset jitter
=================================================
ntp-a2.nict.go. .INIT. 16 u - 1024 0 0.000 0.000 0.000
ntp-a3.nict.go. .INIT. 16 u - 1024 0 0.000 0.000 0.000
*europium.canoni 193.79.237.14 2 u 39 128 377 296.714 -10.670 1.978この結果から、ntp.nict.jp と同期してくれません。
どうしてダメなのでしょうか。。。 同期させるには、別に何か設定する必要があるのでしょうか。。。
~$ sudo apt-get remove --purge ntp
~$ sudo apt-get install ntp
とやって、~$ gksu gedit /etc/ntp.conf で
オリジナルのntp.confに NTPserver を同様に再度追加し、
~$ ntpq -p を実行しましたが、同様な結果です。
オフライン
koisan1949 さんの投稿 (#9):
~$ gksu gedit /etc/ntp.conf でNTP serverの箇所に追記しました。
# You do need to talk to an NTP server or two (or three).
server ntp.nict.jp
server ntp.nict.jp
server ntp.ubuntu.comコード:
~$ ntpq -p remote refid st t when poll reach delay offset jitter ================================================= ntp-a2.nict.go. .INIT. 16 u - 1024 0 0.000 0.000 0.000 ntp-a3.nict.go. .INIT. 16 u - 1024 0 0.000 0.000 0.000 *europium.canoni 193.79.237.14 2 u 39 128 377 296.714 -10.670 1.978この結果から、ntp.nict.jp と同期してくれません。
/etc/ntp.conf ファイルの server 行の記述を以下のようにしてみてはどうでしょう
server -4 ntp.nict.jp server ntp.ubuntu.com
昨今の OS は IPv6 が有効になっています
ところが、インターネットに接続する回線は、未だに IPv4 しか使っていないことがほとんどです
ntp.conf ファイルの server の行で指定した ntp.nict.jp を名前解決すると、IPv6 と IPv4 の二種類のアドレスが得られます
この二種類のアドレスは IPv6 -> IPv4 の順に並んでいます
OS が IPv6 をサポートしていると、NTP はリストの先頭にある IPv6 の アドレスに接続を試みますが、インターネットに接続する回線は IPv4 しか使えないため、これは必ずエラーになります
ntp.ubuntu.com については、名前解決で IPv4 のアドレスしか得られないため、このようなことにはならず正常に接続できます
上のコードで追加した -4 オプションは、名前解決の際に IPv4 のアドレスだけを抽出するように強制するものです
これによって ntp.nict.jp を名前解決したときに IPv6 のアドレスを無視し、IPv4 のアドレスだけを対象にするようになり、接続が正常に行われるようになります
# 乱文容赦
オフライン
ryさん 懇切丁寧な説明ありがとうございました。 納得です。
ryさん による投稿:
ntp.conf ファイルの server の行で指定した ntp.nict.jp を名前解決すると、IPv6 と IPv4 の二種類のアドレスが得られます
この二種類のアドレスは IPv6 -> IPv4 の順に並んでいます
OS が IPv6 をサポートしていると、NTP はリストの先頭にある IPv6 の アドレスに接続を試みますが、インターネットに接続する回線は IPv4 しか使えないため、これは必ずエラーになります
ntp.ubuntu.com については、名前解決で IPv4 のアドレスしか得られないため、このようなことにはならず正常に接続できます
-4 を付加したら正常になりました。
~$ ntpq -p
remote refid st t when poll reach delay offset jitter
==============================================================================
ntp-b3.nict.go. .NICT. 1 u 53 64 1 15.032 -137.49 0.001
ntp-a3.nict.go. .NICT. 1 u 52 64 1 14.474 -136.64 0.001
europium.canoni 193.79.237.14 2 u 51 64 1 281.892 -134.53 0.001オフライン