Presentation title (on one or two lines)

Similar documents
Insert your Title here

Microsoft PowerPoint - WRR-celinux-upload 1.ppt

POSIXスレッド

自己紹介 湯浅陽一 1999 年より Linux kernel 開発に参加 MIPS アーキテクチャのいくつかの CPU へ Linux kernel を移植

POSIXプログラミング Pthreads編

2

S S S S S

Microsoft PowerPoint ppt [互換モード]

Microsoft PowerPoint ppt [互換モード]


untitled

AquesTalk プログラミングガイド

今週の進捗

POSIXスレッド

AMT機能セットアップガイド

Application Note Application Note No. ESC-APN Document No.: ESC-APN adviceluna Linux デバッグ手順 (MIPS コア編 ) はじめに adviceluna Linux デバッグ手順 ( 以

スレッド

04-process_thread_2.ppt

cat A


AquesTalk Win Manual

バイオプログラミング第 1 榊原康文 佐藤健吾 慶應義塾大学理工学部生命情報学科

Developer Camp

PRIMERGY BX924 S4 未サポートOS動作検証確認情報

スライド 1

LinuxカーネルにおけるDevice Tree情報のパース処理

Linuxのベンチマーク評価 とボトルネック解析

ダンプ取得機能強化サポートオプション Enterprise Edition

(1) プログラムの開始場所はいつでも main( ) メソッドから始まる 順番に実行され add( a,b) が実行される これは メソッドを呼び出す ともいう (2)add( ) メソッドに実行が移る この際 add( ) メソッド呼び出し時の a と b の値がそれぞれ add( ) メソッド


// このクラスの有効期間中の各呼び出しに使用される キャッシュされた Socket オブジェクト Socket socket = null; // 非同期処理が完了したことを通知するために信号を送るオブジェクト static ManualResetEvent clientdone = new Ma

アジェンダ Renesas Synergy TM プラットフォーム構成 ThreadX とは ThreadX の状態遷移 ThreadX とμITRONの機能比較 まとめ ページ 2

HULFT Series 製品における Javaの脆弱性(CVE )に対する報告

HashMapからConcurrentHashMapへの移行

AquesTalk2 Win マニュアル

型名 RF007 ラジオコミュニケーションテスタ Radio Communication Tester ソフトウェア開発キット マニュアル アールエフネットワーク株式会社 RFnetworks Corporation RF007SDK-M001 RF007SDK-M001 参考資料 1

スライド 1

背景 1 / Reprinted with permission from paper c 2013 SAE International.

02: 変数と標準入出力



yume_P01-056

校友会16号-ol.indd

Page 1

Microsoft Word - 第5回 基本データ構造2(連結リスト).doc

3.....ren

2 key. 3

Microsoft PowerPoint - CproNt02.ppt [互換モード]

Web Web Web Web Web, i

bitvisor_summit.pptx

AN424 Modbus/TCP クイックスタートガイド CIE-H14

RX ファミリ用 C/C++ コンパイラ V.1.00 Release 02 ご使用上のお願い RX ファミリ用 C/C++ コンパイラの使用上の注意事項 4 件を連絡します #pragma option 使用時の 1 または 2 バイトの整数型の関数戻り値に関する注意事項 (RXC#012) 共用

S1C17 Family Application Note S1C17 シリーズ PORT 多重割り込みアプリケーションノート Rev.1.0

RTC_STM32F4 の説明 2013/10/20 STM32F4 内蔵 RTC の日付 時刻の設定および読み込みを行うプログラムです UART2( 非同期シリアル通信ポート 2) を使用して RTC の設定および読み込みを行います 無料の開発ツール Atollic TrueSTUDIO for

Linux障害解析の状況と今後の展望

02: 変数と標準入出力

Transcription:

社会インフラシステムへの Linux の適用 Applying Linux to Social Infrastructure Systems ( 株 ) 東芝宮川雅紀 2016 年 3 月 11 日 2016 Toshiba Corporation

自己紹介 2016 Toshiba Corporation 2

目次 システム概要 Linux 適用で発生した問題の事例 事例 1 : pthread_mutex_lockによるデッドロック 事例 2:e1000ドライバによるkernelパニック まとめ 社会インフラシステムへの Linux 適用で見えてきた課題 2016 Toshiba Corporation 3

目次 システム概要 Linux 適用で発生した問題の事例 事例 1 : pthread_mutex_lockによるデッドロック 事例 2:e1000ドライバによるkernelパニック まとめ 社会インフラシステムへの Linux 適用で見えてきた課題 2016 Toshiba Corporation 4

システム概要 何故 Linux か? TCP/IPベースの産業用通信プロトコルスタックライブラリが入手しやすい 豊富なCPUアーキテクチャサポート 商用利用可能なディストリビューション 産業用通信プロトコルスタックをサードベンダから購入する 弊社で開発したシステムの概要は以下 Main Control Application Communication Control Application ModbusTCP Foundation Fieldbus Profibus DP DeviceNet User Land ( Ex. Debian) Linux Kernel 2016 Toshiba Corporation 5

目次 システム概要 Linux 適用で発生した問題の事例 事例 1 : pthread_mutex_lockによるデッドロック 事例 2:e1000ドライバによるkernelパニック まとめ 社会インフラシステムへの Linux 適用で見えてきた課題 2016 Toshiba Corporation 6

Linux を適用して発生した問題の事例 事例 1 pthread_mutex_lockによるデッドロック 問題の概要 Linux 適用製品の連続通電にて 1 週間に2,3 回の割合でWDTリセット発生 問題発生時 あるプロセスのCPU 使用率が90% を超える 問題を起こすプロセスのスケジューリングポリシはSCHED_FIFO ( 優先度 98) 2016 Toshiba Corporation 7

Linux を適用して発生した問題の事例 proc/<pid>/task/stat からスレッドの状態を得る 問題のスレッドより高い優先度を持つスレッド以外スケジュールされない状態 /proc/1649/task # cat */stat ; sleep 20; cat */stat; 1649 (hoge) R 1646 1369 1369 0-1 4194560 917 0 0 0 4 13 0 0-2 0 8 < 省略 > 1652 (hoge) R 1646 1369 1369 0-1 4194624 65 0 0 0 217544 197974 0 0-3 0 8 < 省略 > 1654 (hoge) S 1646 1369 1369 0-1 4194368 26 0 0 0 1115 1307 0 0-2 0 8 0 < 省略 > 1655 (hoge) R 1646 1369 1369 0-1 4194368 32 0 0 0 462 1026 0 0-2 0 8 0 < 省略 > 1656 (hoge) R 1646 1369 1369 0-1 4194368 1 0 0 0 173151 108241 0 0-2 0 8 0 < 省略 > 1657 (hoge) R 1646 1369 1369 0-1 4194624 52 0 0 0 83078 35263 0 0-2 0 8 0 < 省略 > 1658 (hoge) R 1646 1369 1369 0-1 4194368 43 0 0 0 634972 282472 0 0-3 0 8 < 省略 > 優先度 99のスレッド CPU 使用時間が更新されていない 1659 (hoge) R 1646 1369 1369 0-1 4194368 0 0 0 0 377 1076 0 0-2 0 8 < 省略 > < 20sec > 優先度 98のスレッド CPU 使用時間が更新されている 1649 (hoge) R 1646 1369 1369 0-1 4194560 917 0 0 0 4 13 0 0-2 0 8 0 < 省略 > 1652 (hoge) R 1646 1369 1369 0-1 4194624 65 0 0 0 218583 198968 0 0-3 0 8 0 < 省略 > 1654 (hoge) S 1646 1369 1369 0-1 4194368 26 0 0 0 1115 1307 0 0-2 0 8 0 < 省略 > 1655 (hoge) R 1646 1369 1369 0-1 4194368 32 0 0 0 462 1026 0 0-2 0 8 0 < 省略 > 1656 (hoge) R 1646 1369 1369 0-1 4194368 1 0 0 0 173151 108241 0 0-2 0 8 0 < 省略 > 1657 (hoge) R 1646 1369 1369 0-1 4194624 52 0 0 0 83078 35263 0 0-2 0 8 0 < 省略 > 1658 (hoge) R 1646 1369 1369 0-1 4194368 43 0 0 0 636006 283470 0 0-3 0 8 0 < 省略 > 1659 (hoge) R 1646 1369 1369 0-1 4194368 0 0 0 0 377 1076 0 0-2 0 8 0 < 省略 > 2016 Toshiba Corporation 8

Linux を適用して発生した問題の事例 gdbserver + gdb で問題が発生したプロセスにアタッチ pthread_mutex_lockの呼び出しから戻らないことが判明 この時ロック変数は優先度 99のスレッドによってロックされていた 怪しいと思った点 pthread inheritanceを使用していない 優先度 99のスレッドと優先度 98のスレッドが排他制御を行っている 優先度逆転現象が起こり得る! 納得できない点 PTHREAD_MUTEX_INITIALIZERで初期化していない 優先度逆転現象が起きたとしてもデッドロックはしないはず 常時発生するわけではない 2016 Toshiba Corporation 9

Linux を適用して発生した問題の事例 問題の発生を ftrace でトレースする 短時間で sys_futex を繰り返し呼び出していることが分かる <function-tracer> ~/dbgfs/tracing # cat trace # tracer: function # # TASK-PID CPU# TIMESTAMP FUNCTION # hoge-1657 [000] 6769.147788: futex_wait_setup <-futex_wait hoge-1657 [000] 6769.147788: get_futex_key <-futex_wait_setup hoge-1657 [000] 6769.147789: sys_futex <-syscall_call hoge-1657 [000] 6769.147789: do_futex <-sys_futex hoge-1657 [000] 6769.147789: futex_wait <-do_futex hoge-1657 [000] 6769.147789: futex_wait_setup <-futex_wait hoge-1657 [000] 6769.147790: get_futex_key <-futex_wait_setup hoge-1657 [000] 6769.147790: sys_futex <-syscall_call hoge-1657 [000] 6769.147790: do_futex <-sys_futex hoge-1657 [000] 6769.147791: futex_wait <-do_futex hoge-1657 [000] 6769.147791: futex_wait_setup <-futex_wait hoge-1657 [000] 6769.147791: get_futex_key <-futex_wait_setup 2016 Toshiba Corporation 10

Linux を適用して発生した問題の事例 sys_futex の実装を確認する ロック変数が 4 バイト境界に配置されていない時 -EINVAL を返す static int get_futex_key(u32 user *uaddr, int fshared, union futex_key *key) { unsigned long address = (unsigned long)uaddr; struct mm_struct *mm = current->mm; struct page *page; int err; /* * The futex address must be "naturally" aligned. */ key->both.offset = address % PAGE_SIZE; if (unlikely((address % sizeof(u32))!= 0)) return -EINVAL; address -= key->both.offset; 一方 pthread_mutex_lockはロック変数がロックされている状態でsys_futexから-einval が返されたとき sys_futexを再度呼び出す実装 実際にロック変数のアドレスが 4 バイト境界ではなかった! 2016 Toshiba Corporation 11

Linux を適用して発生した問題の事例 問題発生時の pthread_mutex_lock の動作まとめ thread A thread B 優先度 99 優先度 98 pthread_mutex_lock クリティカルセクション lock preempt ロック変数 wait thread A スケジュール待ち therad B ロック解放待ち ( ビジーループ ) pthread_mutex_lock ビジーループの発生! クリティカルセクション pthread_mutex_unlock pthread_mutex_unlock 2016 Toshiba Corporation 12

Linux を適用して発生した問題と事例 マルチコア環境では再現性が低い Proc A Proc B 優先度 99 優先度 98 Proc C 優先度 98 pthread_mutex_lock lock ロック変数 preempt wait ビジーループ! pthread_mutex_lock ビジーループ! クリティカルセクション thread A スケジュール待ち therad B ロック解放待ち ( ビジーループ ) thread C ロック解放待ち ( ビジーループ ) クリティカルセクション wait pthread_mutex_lock クリティカルセクション pthread_mutex_unlock pthread_mutex_unlock pthread_mutex_unlock 2016 Toshiba Corporation 13

Linux を適用して発生した問題と事例 要因は? ロック変数が4バイト境界に配置されていなかったこと pthread_mutex_lockの実装の問題 pthread inheritanceを使用していなかったという問題 対策 優先度を継承していれば問題は発生していなかった ロック変数を4バイト境界に移動 pthread_mutex_lockの修正は難しい 2016 Toshiba Corporation 14

Linux を適用して発生した問題と事例 発生条件まとめ ロック変数を4バイト境界に配置しない 優先度の異なる複数のリアルタイムスレッドにて排他制御をする pthread_mutex_lockで排他制御をする pthread inheritanceを使用しない 問題を引き起こした環境 Kernel : Linux-2.6.33.9-rt31 UserLand : Debian Squeeze (eglibc-2.11.3-4) 他の比較的新しい環境でも再現 Kernel:Linux-3.13.3 UserLand:Ubuntu14.04 (glibc 2.19) 2016 Toshiba Corporation 15

Linux を適用して発生した問題の事例 事例 2 e1000ドライバによるoops + カーネルパニック 問題の概要 Linux 適用製品の連続通電にて カーネルパニック発生 カーネルが出したバックトレースからe1000ドライバで発生していることを特定 製品出荷後約 3 年後の出来事 2016 Toshiba Corporation 16

Linux を適用して発生した問題の事例 問題に対するパッチはすぐに見つかった https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1009545 より引用 2016 Toshiba Corporation 17

Linux を適用して発生した問題の事例 製品出荷から時間が経ち過ぎている このパッチは製品で使用している Kernel に素直にあたってくれるだろうか パッチの内容を確認すると 思ったより小規模 これなら大丈夫! 2016 Toshiba Corporation 18

Linux を適用して発生した問題の事例 新たな不安 今回は大事を免れたが 今後大きな修正パッチが出た時 無事適用できるか Long-term support 版を使用する? Target kernel selection rules Maintainer will choose one LTS version per year Maintain it for 2 years from its original release https://events.linuxfoundation.org/images/stories/slides/elc2013_munakata.pdf より引用 社会インフラシステムのライフサイクルはもっと長い 20 年前に出荷した製品の保守が必要になるケースがある 2016 Toshiba Corporation 19

まとめ 社会インフラシステムへの適用で見えてきた点 事例 1 より 信頼性 linuxの信頼性はかなり高い アプリケーションの実装でも思いもよらない落とし穴がある 設計段階で見つけにくい 開発者の経験値は必要 事例 2 より 保守性 メンテナンス期間はLong-term support 版の期間を上回る 社内にOSSの動向をウオッチするメンテナが必須 2016 Toshiba Corporation 20