何のチューニングも施さないオリジナルのLinuxカーネルを使ってどの程度の機器制御が可能なのかの目安を知るために、Linuxの割り込み応答性能を調べてみました。
オシロスコープ校正用の1kHzクロック信号を割り込み信号としてプリンターポートに入力します。この割り込み信号をLinuxデバイスドライバで処理し、応答パルス信号をプリンタポートから出力します。プリンターポートに入力した割り込み信号と出力される応答パルス波をオシロスコープで観察することによってLinuxの応答遅延時間を測定しました。測定では他の割り込み源としてEthernetやハードディスク制御、RS-232C制御などの負荷を同時にかけた上で実施しました。
入力クロック: | 1kHz |
入力ポート: | LPT1(0x378)の*Ackビット |
割り込みマスク: | なし |
割り込み要求(IRQ): | 7 |
出力ポート: | LPT1(0x378)のD0ビット |
応答パルス幅: | 2μs |
オシロスコープ校正用の信号はドライブ能力が低く直接プリンタポートに入力すると電圧がドロップしてしまい割り込みがかからなかったのでトランジスタによってバッファリングしました。
本測定のために作成したプログラムは以下の通りです
デバイスドライバ(割り込み処理関数の部分のみ抜粋)
20μ秒のパルスをデータポートに出力します。
static irqreturn_t tact_interrupt(int irq, void*dev_id) {
tact_write_data( (unsigned char)0xff );
udelay(20);
tact_write_data( (unsigned char)0 );
return IRQ_HANDLED;
}
イーサネットおよびHDDの負荷
Web上のリソースを連続してダウンロードします。
#!/bin/bash
count=1
while [ $count -le 100 ];
do
echo "################# Ethernet Load $count ##################"
wget ftp://kernel.org/pub/linux/kernel/v2.6/linux-2.6.27.6.tar.bz2
count=`expr $count + 1`
done
シリアルポートの負荷
シリアルポートに連続して文字を出力します。
#!/bin/bash
count=1
while [ $count -le 1000 ];
do
echo "################# Serial port Load $count ##################"
echo "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" > /dev/ttyS0
echo "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" > /dev/ttyS1
count=`expr $count + 1`
done
●Linuxのバージョン
ディストリビューション: | Ubuntu 8.10 |
カーネル: | 2.6.27.2 |
●プラットフォーム
この測定で使用したパソコンはFujitu社PRIMERGY C150( Intel Pentium 4 1.8GHz / RAM 256MB )。サーバーとして使用していたタワータイプのIBM PC/AT クローンです。
●MPU資源割り当て
HZ値は250、つまり4ミリ秒。
/procは次のとおりです。
割り込み(IRQ)
0: 964 IO-APIC-edge timer
1: 199 IO-APIC-edge i8042
3: 2 IO-APIC-edge
4: 2 IO-APIC-edge
8: 2 IO-APIC-edge rtc0
9: 0 IO-APIC-fasteoi acpi
12: 65688 IO-APIC-edge i8042
14: 0 IO-APIC-edge ata_piix
15: 143575 IO-APIC-edge ata_piix
16: 1024331 IO-APIC-fasteoi r128@pci:0000:01:00.0
18: 58973 IO-APIC-fasteoi sym53c8xx
19: 0 IO-APIC-fasteoi uhci_hcd:usb1
20: 29448 IO-APIC-fasteoi eth0
23: 0 IO-APIC-fasteoi uhci_hcd:usb2
NMI: 0 Non-maskable interrupts
LOC: 235048 Local timer interrupts
RES: 0 Rescheduling interrupts
CAL: 0 function call interrupts
TLB: 0 TLB shootdowns
SPU: 0 Spurious interrupts
ERR: 0
MIS: 0
I/Oポート
0000-001f : dma1
0020-0021 : pic1
0040-0043 : timer0
0050-0053 : timer1
0060-0060 : keyboard
0064-0064 : keyboard
0070-0071 : rtc0
0080-008f : dma page reg
00a0-00a1 : pic2
00c0-00df : dma2
00f0-00ff : fpu
0170-0177 : 0000:00:1f.1
0170-0177 : ata_piix
01f0-01f7 : 0000:00:1f.1
01f0-01f7 : ata_piix
02f8-02ff : serial
0376-0376 : 0000:00:1f.1
0376-0376 : ata_piix
03c0-03df : vga+
03f6-03f6 : 0000:00:1f.1
03f6-03f6 : ata_piix
03f8-03ff : serial
04d0-04d1 : pnp 00:02
0800-087f : pnp 00:02
0cf8-0cff : PCI conf1
1000-101f : 0000:00:1f.2
1000-101f : uhci_hcd
1400-140f : 0000:00:1f.3
1800-181f : 0000:00:1f.4
1800-181f : uhci_hcd
1c00-1c0f : 0000:00:1f.1
1c00-1c0f : ata_piix
2000-2fff : PCI Bus 0000:01
2000-20ff : 0000:01:00.0
3000-3fff : PCI Bus 0000:02
3000-30ff : 0000:02:07.0
3000-30ff : sym53c8xx
3400-343f : 0000:02:08.0
3400-343f : e100
f000-f07f : 0000:00:1f.0
f000-f07f : pnp 00:02
f000-f003 : ACPI PM1a_EVT_BLK
f004-f005 : ACPI PM1a_CNT_BLK
f008-f00b : ACPI PM_TMR
f010-f015 : ACPI CPU throttle
f028-f02b : ACPI GPE0_BLK
f02c-f02f : ACPI GPE1_BLK
f060-f07f : iTCO_wdt
f100-f10f : pnp 00:02
f180-f1bf : 0000:00:1f.0
f180-f1bf : pnp 00:02
f820-f82f : pnp 00:02
fe00-fe00 : pnp 00:02
測定の結果割り込み応答時間は10μ秒~最大約100μ秒であることが判りました。ただし、この100μ秒という値はあくまでも測定回数の範囲内でのワーストケースであり、真のワーストケースは分りません。
立ち上がり部分を拡大
もちろん、通常のLinuxカーネルをハードリアルタイム処理へ応用することはできませんが、この程度の遅延やジッタが許容できるアプリケーションであれば利用できるはずです。例えば、2行x16桁などのキャラクタ液晶表示器の制御するいくつかのデバイスドライバ、LCD4Linux、LCD-Linux、LCDproc などは良い例です。