備忘録:Random freeze Problem (Ubuntu 16.04 on Intel Joule 570x)

まず,結論: Intel のBay TrailとUbuntu 16.04の組み合わせはc-state bugがあり,ランダムにフリーズする.解決策はgrubに intel_idle.max_cstate=1 を追記する. ことの成り行き: Intel Joule 570x とGPSモジュールで遊んでいた時のこと 「あれ,gpsd動かしてるとフリーズするぞ?しかもシステムが完全に」 被害者:Intel Joule 570x(Ubuntu 16.04) 被害状況:起動後1分から20分程度の間にシステムが完全にフリーズ.フリーズまでの時間はランダム.gpsdを止めるとフリーズしない. 状況から考えてまず浮かび上がった容疑者は4人 容疑者1:gpsd 容疑者2: シリアルポートの設定(stty) 容疑者3: gpsmonなどのgpsdクライアント 容疑者4: FTDIのUSB-Serial変換ドライバ 捜査: まずgpsmonを使っているとフリーズしたので,gpsmonを停止してみるがフリーズする.また,gpsdを起動するとフリーズする傾向があったため,そこのバグを疑う.とりあえずgpsdを止めてみるとフリーズしない.そこで,gpsdを止めた状態でscreenコマンドでシリアル通信内容を確認してみる.すると止まる. シリアルポートの設定かとおもい,sttyでいろいろ設定を変えてみるものの,シリアル通信内容を見ていると止まる.しかも止まるまでの時間はランダム.突然完全にフリーズするので,ソフトウエアな感じがしない.もっとローレベルな部分で止まってる気がする.そこで,FTDIのドライバを疑うも,海外の同じような症状の人が「ドライバビルドして入れ直したけどダメ」と書き込んでいたので,行き止まる. 手がかりとしては,突然がっつり止まることから非常にローレベルな部分,なんならハードウエアの障害くさい. で,いろいろ調べてみて最初に書いたBay TrailアーキテクチャとUbuntu 16.04(kernel 4.2以降)のバグにたどり着く.Intel Joule 570xはBay Trailらしく,もろにこの問題にぶち当たった. Bay TrailはAtomとかCeleron, Pentiumみたいな最近の省電力なチップで採用されているので,Ubuntuを使う人も多い気がします.謎のフリーズに悩まされている人は,c-stateを1にするという対策で解決する可能性があります. 残存課題: しかし,なぜusb-serialを使うと起きるのかは謎のまま.また,これでC-stateがmaxで1になると,たとえばjouleで最低でも0.5A程度,常に消費することになる(c-stateが通常範囲だと,0.1Aとか必要に応じて電力消費を抑えられる). 組み込み&ubuntuでこの問題は結構痛い.