Linuxの割り込み応答性能

何のチューニングも施さないオリジナルの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桁などのキャラクタ液晶表示器の制御するいくつかのデバイスドライバ、LCD4LinuxLCD-LinuxLCDproc などは良い例です。