Material for MkDocs を日本語対応した話&初めてのOSSコントリビュート

結論: MkDocs (0.17以上) + Material (2.0.3以上) テーマにおいて、次の設定を行うことで日本語UI表示+日本語検索(マルチバイト検索)が可能になります!

theme:
  name: 'material'
  language: 'ja'
extra:
  search:
    language: 'jp'

MkDocs いいよ、MkDocs

www.mkdocs.org

最近仕事で MkDocs というドキュメントジェネレーターを導入し始めています。マニュアルやドキュメントを作る際、オフライン(スタンドアロン環境)で参照したり他部門に成果物を共有したりする場合があるため WikiCMS はポータビリティの関係からできれば使いたくないし、かといってHTML手書きはさすがに辛い。また PowerPoint や Word で消耗したくもない。そんなとき思いついたのが静的ファイルを生成してくれるドキュメントジェネレーターでした。

Sphinx や Re:VIEW などが有名ですがそこまでの表現力・柔軟性は要りませんし、何より他のシステムとの互換性から Markdown を使いたかったので一番よく耳にする MkDocs を採用しました。(Python製ってのも惹かれた)

f:id:miyahan:20171115000825p:plain

一般的な Markdown ファイルにサイト構成(ページ一覧)を書いたYAMLファイルを1つ作るだけで動き、吐き出されるHTMLもおシャレでわかりやすくかなり気に入ったのですが、唯一、日本語検索ができないという制約が引っかかりました。

Material for MkDocs 日本語対応

MkDocsによるドキュメント作成 - Qiita のように独自に改良されている事例もありましたが、ドキュメントをビルドするたびにファイルを差し替える必要があり面倒そうでした。そんなときサードパーティー製のテーマである Material for MkDocs で言語を指定するとマルチ言語対応の全文検索ライブラリ lunr-languages を自動でロードすることに気づきました。どうやら独自で多言語化対応を進めているようです。

まだ日本語には対応しておらず日本語を指定するとエラーになって使えない状態でしたが、見よう見まねで言語定義ファイルを作ってみたところ日本語表示&日本語検索が動くようになりました!

f:id:miyahan:20171107004355p:plain f:id:miyahan:20171107004404p:plain

やればできるもんですね。

日本語検索ができない事に困っている記事をよく見かけましたし、なによりも自分が解決されてほしいと思っていたので勇気を出して日本語対応のプルリクを送ろうと決意しました。

はじめてのOSSコントリビュート

とはいえプルリクなんて送ったこともないですし、そもそも git もろくに使えず、手に負えなくなったらプロジェクトごと作り直すなんてことをやってるくらいです。でも幸いコントリビュートの方法がドキュメントに詳しく書いてあったのでその通り行動しました。

プロジェクトを fork して separate git branch でいじれとな。セパレート??ブランチを切れってことかな? で、プルリクを送る前に yarn でビルドしろとな。ビルドしたファイルが必要? ビルドが通ることをチェックする目的?? 他の人のプルリクみるとビルドファイルは push してないのでたぶん後者だ。

ひーひー言いながらなんとかプルリクを送信。

f:id:miyahan:20171107001251p:plain

おお、なんか自動でコードの品質チェックとビルドが走ってる〜。これが噂に聞く異世界の超科学、継続的インテグレーション!!そして数分後、

f:id:miyahan:20171107001952p:plain

通ったーー!! ヽ(゚∀゚)ノ
手の平にこんなに汗をかいたのは久しぶりです。

そしてさらに翌日…

f:id:miyahan:20171107002302p:plain

キタ━━━( ´∀`)・ω・) ゚Д゚)・∀・) ̄ー ̄)´_ゝ`)━━━!!!!

f:id:miyahan:20171107002547p:plain

泣きそう。

そして同日、僕のコミットを取り込んだバージョンが晴れてリリースされました。お仕事が早い。英単語をいくつか和訳しただけではありますが、こうして人生初めてのOSSコントリビュートは無事成功したのでした。

オチ

プルリクのコメント欄で作者とやりとりしたところ、実は実装は済んでおり以前から設定ひとつで日本語検索を有効化できることが判明。しかし公式ドキュメントの表記が間違っており、自分も含めて誰も使えていない状況だったというオチでした。まあこのやりとりのおかげでドキュメントのミスに気づいて修正できたし、UIが日本語で表示されるというのは紛れもなく機能追加だからよしとしましょう。

Previous になっただけで何がうれしいんだ?と思う方も多いと思いますが、義務教育で習う英単語1つにすら拒絶反応を起こす英語アレルギー持ちの人(というかただの思考停止してる人)がいるため、日本語化はけっこう重要なんです。

Material for MkDocs 日本語対応方法

というわけで最後に日本語表示&日本語検索するための設定方法を紹介します。mkdocs.yml を次のように設定するだけです。

theme:
  name: 'material'
  language: 'ja'
extra:
  search:
    language: 'jp'

じつはここに罠がありまして、日本語の言語コードは ISO 639-1 で ja と決められていますが、lunr-languages はそれを誤って jp で実装してしまっているためいろいろ不都合が生じていました。その対処として上記の通り2種類の言語設定を書く必要があります。

なおこの問題は master ブランチではすでに修正が入っており、次のリリース(lunr-languages 2.0.0?)で ja にリネームされ、jpja へのエイリアスになる予定です。そうなれば、extra/search/language の設定は不要になります。

というわけで、MkDocs + Material は日本語フルサポートとなりました。みなさんぜひ活用なさってください!!

長時間快適に作業できる監視環境をつくる

イケてる監視ツールとかではなく、パソコン本体のおはなしをします。

こんにちは。とある通信会社の委託でネットワークの監視・保守をやっている作業員です(エンジニアじゃないよ)。24時間365日休むこと無く業務を行っていますが、16時間にもなる夜勤をこなすには、快適な作業環境が必要不可欠です。このエントリでは、2015年に行った監視業務用PC・ディスプレイの更改の実体験を通して得られた知見をご紹介したいと思います。

〜忙しい人向けサマリ〜

  • PCは遅くとも5年で買い替えた方がいい
  • でも同時期に買った機械は同時期に壊れるので分散して買い替えたほうがいい
  • 最近のミニPCは普通に使えるのでおすすめ
  • 高効率電源ユニット(80 PLUS)にすると消費電力・発熱が大幅ダウン
  • 液体電解コンデンサは低寿命なので、固体コンデンサを使ったPCを選ぼう
  • システムドライブは絶対にSSDにしよう。マジ別世界
  • 液晶は VA か IPS のものにしよう。TNでピボットするとマジ悲惨
  • ディスプレイは画面サイズだけではなく、ドットピッチも考えて
  • 安い液晶はフリッカー(チラつき)に注意。健康第一
  • 眼の高さより高くなる大きなディスプレイはドライアイの原因になる
  • ディスプレイは角度だけではなく、高さも調整できるものを選ぼう
  • ブルーライトは設定で軽減できる

Update

  • 2017/1/7 : 選定端末のベンチマーク結果を追加、ミニコラム「写真を撮ってディスプレイを調整しよう」を追加、その他誤字修正

おしながき

  • おしながき
  • 監視環境の故障傾向
  • 端末に求められる要件
  • 端末の機種選定:HP EliteDesk 800 G1 DM
    • 特徴1:小さい
    • 特徴2:低消費電力・低発熱
    • [Coffee Break] Tera Term はGPUで早くなる!?
    • [Coffee Break] Energy Star 対応品を選定しよう
      • 80PLUS
      • ENERGY STAR
      • メリットしかないのでぜひ選択を
    • 特徴3:高い堅牢性
    • 特徴4:十分な性能
  • ディスプレイに求められる要件
    • VDT症候群対策
      • ディスプレイの明るさ
      • 文字の大きさ
      • 画面の高さ
      • その他
    • ブルーライト対策
    • [Coffee Break] 写真を撮ってディスプレイを調整しよう
    • ディスプレイの選定条件
    • ディスプレイ配置要件
  • ディスプレイの選定:DELL U2414H / U2415
  • さいごに
続きを読む

Mac mini のディスク不調、SMCリセットで直る

狂うストレージ

先日、自宅サーバーにしている Mac mini (Mid 2011) からアラートメールが届きました。

Computer name     : MacMini
Host name         : MacMini
Computer model    : Macmini5,1
Drives in report  : 1

### DRIVE 1 OF 1 ###

Drive Volume(s)   : MacMiniTimeMachine
Serial No         : 
Model Family      : 
Model             : 7K8:/\6?w`$(It6&D  0 B
Drive Type        : HDD
Device Path       : /dev/disk1

Advanced S.M.A.R.T. status : FAILED
Overall Health Rating      : BAD 10.3%
Overall Performance Rating : LOW 31.7%
Issues found               : 5

=== Problems Summary ===
Failed Indicators (life-span / pre-fail)  : 5 (1 / 4)
Failing Indicators (life-span / pre-fail) : 0 (0 / 0)
Warnings (life-span / pre-fail)           : 0 (0 / 0)
S.M.A.R.T. Errors count                   : 0
I/O Errors Count                          : 0 (0 / 0)

バックアップ用に使っている外付けUSB HDDのアラートのようです。SMARTの中身を見てみると・・・

Total Capacity                       : unknown
Model                                : 7K8:/\6Θw`$(It6&D
Firmware Version                     : -¥
Drive Type                           : HDD

Power Cycles Count                   : 118,784
Current Power Cycle Time             : 48.9 hours

=== DRIVE HEALTH INDICATORS ===
ID   | NAME                                        | TYPE      | UPDATE | RAW VALUE                  | VALUE | THRESHOLD | WORST | STATUS          | LAST MODIFIED      
  12   Power Cycle Count                             Pre-fail    online          0xC24F0001D000            0         223      2     100%  OK          2016/12/23 13:20     
  31   Unknown Attribute                             Pre-fail    online          0x3E34CD6AE649          243         223    219     100%  OK          2016/12/23 13:20     
  34   Unknown Attribute                             Pre-fail    offline         0x7CC9D46933EE           74         221    194     100%  Failed      2016/12/23 13:20     
  41   Unknown Attribute                             Pre-fail    offline         0xC11403A8EDDE          122         113     35    10.3%  OK          2016/12/23 13:20     
  42   Unknown Attribute                             Pre-fail    online          0x33DFA095459E            3         251     97     100%  Failed      2016/12/23 13:20     
  46   Unknown Attribute                             Pre-fail    online          0xAE6F3EB70DE8          187         167    151    60.6%  OK          2016/12/23 13:20     
  62   Unknown Attribute                             Life-span   online          0x2C8DC26D2C05          228         154    186     100%  OK          2016/12/23 13:20     
  65   Unknown Attribute                             Life-span   online          0x24049C09390A          104          46    229    37.7%  OK          2016/12/23 13:20     
  66   Unknown Attribute                             Pre-fail    online          0x800000020000          182          67     76    86.5%  OK          2016/12/23 13:20     
  98   Unknown Attribute                             Pre-fail    offline         0x13901948309           252         145     53     100%  OK          2016/12/23 13:20     
 104   Unknown Attribute                             Life-span   offline         0xD9D594030F1A          159         120    179    48.8%  OK          2016/12/23 13:20     
 111   Unknown Attribute                             Life-span   online          0xFD248789F941          189          50    250    92.7%  OK          2016/12/23 13:20     
 132   Unknown Attribute                             Pre-fail    offline         0x66610DB2A160          213         253    248     100%  Failed      2016/12/23 13:20     
 138   Unknown Attribute                             Life-span   online          0x27559167466B          182         138     23    71.0%  OK          2016/12/23 13:20     
 139   Unknown Attribute                             Life-span   offline         0x623761F989EC          167         132    200    51.5%  OK          2016/12/23 13:20     
 170   Unknown Attribute                             Pre-fail    online          0xE9CE8CC4C0D6          163          23     32    79.1%  OK          2016/12/23 13:20     
 172   Unknown Attribute                             Pre-fail    offline         0x4D6030F412F2          189         149    140    78.4%  OK          2016/12/23 13:20     
 176   Unknown HDD Attribute                         Life-span   offline         0x436EBAFFCFDE            0           0      0     100%  OK          2016/12/23 13:20     
 185   Unknown Attribute                             Life-span   online          0x45896BA6A3C5          222         130    213     100%  OK          2016/12/23 13:20     
 187   Reported Uncorrectable Errors                 Pre-fail    offline         0xF158EC29A791          240         157    250     100%  OK          2016/12/23 13:20     
 190   Airflow Temperature Celsius                   Pre-fail    offline              143                181          53     84    87.1%  OK          2016/12/23 13:20     
 201   Soft Read Error Rate                          Life-span   offline         0x7116CBBB6E5A           88          44     90    78.6%  OK          2016/12/23 13:20     
 220   Disk Shift                                    Pre-fail    online          0x7A20219FCD7F          127          43     27    53.5%  OK          2016/12/23 13:20     
 230   Head Amplitude                                Life-span   offline         0xB757BDEBC509          113         228    117     100%  Failed      2016/12/23 13:20     
 234   Unknown Attribute                             Pre-fail    online          0xC4F694E85DB2          172         159    214    31.7%  OK          2016/12/23 13:20     
 236   Unknown Attribute                             Pre-fail    online          0x79712CDEBBA2          240         155     99     100%  OK          2016/12/23 13:20     
 250   Read Error Retry Rate                         Pre-fail    online          0x66FAA5AD308A          204         215    129     100%  Failed      2016/12/23 13:20     
 254   Free Fall Sensor                              Pre-fail    offline         0x306CDA79A73F          229         113     66     100%  OK          2016/12/23 13:20 

機種名やファームウェアバージョン情報は文字化けしているし、統計情報の attribute id も value もハチャメチャです。完全に逝っちゃってますね。しかし、このHDDを別のMacに接続したところ、正常にSMARTを読み込めたのでHDDが壊れているわけではなさそうです。

とりあえずマシンを再起動してみたのですが、なんとOSのシャットダウンに10分もかかりました。状況を確認していたところ、普段は10分程度で終わるはずのバックアップがある日を境に10時間以上かかるようになっていたことも判明。ディスクのパフォーマンスが低下している・・・?

f:id:miyahan:20161223163409p:plain

システムディスク(Crucial MX200 SSD) に対しベンチマークを取ってみたところ、ななんとスループットが数百KB/s に低下しています!

内蔵SSDと外付HDDが同時におかしくなるということは、OS か Mac mini 本体のハードウェア障害が疑われます。ローレイヤーな話なので SMC (System Management Controller) も怪しいところ。

SMCリセット

support.apple.com

というわけでまずはSMCリセットから。Mac mini 本体の電源ケーブルを抜き、数十秒放置すればリセットされます。

f:id:miyahan:20161223163952p:plain

おお、システムディスクのパフォーマンス低下直ったー!

Total Capacity                       : 1.0 TB (1,000,204,886,016 Bytes)
Model Family                         : Toshiba 2.5" HDD MQ01ABD...
Model                                : TOSHIBA MQ01ABD100
Form Factor                          : 2.5 inches
Firmware Version                     : AX001U
Drive Type                           : HDD 5400 rpm

Power On Time                        : 26,509 hours (36 months 24 days 13 hours)
Power Cycles Count                   : 44
Current Power Cycle Time             : 115.4 hours

=== DRIVE HEALTH INDICATORS ===
ID   | NAME                                        | TYPE      | UPDATE | RAW VALUE                  | VALUE | THRESHOLD | WORST | STATUS          | LAST MODIFIED      
   1   Raw Read Error Rate                           Pre-fail    online               0x0                100          50    100     100%  OK          -                    
   2   Throughput Performance                        Pre-fail    offline               0                 100          50    100     100%  OK          -                    
   3   Spin Up Time                                  Pre-fail    online              2,607               100           1    100     100%  OK          2016/12/23 16:41     
   4   Start Stop Count                              Life-span   online              75,920              100           0    100     100%  OK          2016/12/23 16:41     
   5   Reallocated Sector Count                      Pre-fail    online                0                 100          50    100     100%  OK          -                    
   7   Seek Error Rate                               Pre-fail    online               0x0                100          50    100     100%  OK          -                    
   8   Seek Time Performance                         Pre-fail    offline               0                 100          50    100     100%  OK          -                    
   9   Power On Hours                                Life-span   online              26,509               34           0     34    34.0%  OK          2016/12/23 16:41     
  10   Spin Retry Count                              Pre-fail    online                0                 253          30    100     100%  OK          -                    
  12   Power Cycle Count                             Life-span   online                44                100           0    100     100%  OK          2016/12/23 16:41     
 191   G-Sense Error Rate                            Life-span   online                0                 100           0    100     100%  OK          -                    
 192   Power-Off Retract Count                       Life-span   online                5                 100           0    100     100%  OK          2016/12/23 16:41     
 193   Load Cycle Count                              Life-span   online             277,353               73           0     73    73.0%  OK          2016/12/23 16:41     
 194   Temperature (Celsius)                         Life-span   online                30                100           0    100     100%  OK          2016/12/23 16:41     
 196   Reallocated Event Count                       Life-span   online                0                 100           0    100     100%  OK          -                    
 197   Current Pending Sectors Count                 Life-span   online                0                 100           0    100     100%  OK          -                    
 198   Offline Uncorrectable Sector Count            Life-span   offline               0                 100           0    100     100%  OK          -                    
 199   UDMA CRC Error Count                          Life-span   online                0                 200           0    200     100%  OK          -                    
 220   Disk Shift                                    Life-span   online                0                 100           0    100     100%  OK          -                    
 222   Loaded Hours                                  Life-span   online              3,375                92           0     92    92.0%  OK          2016/12/23 16:41     
 223   Load Retry Count                              Life-span   online                0                 100           0    100     100%  OK          -                    
 224   Load Friction                                 Life-span   online                0                 100           0    100     100%  OK          -                    
 226   Load-in Time                                  Life-span   online               176                100           0    100     100%  OK          2016/12/23 16:41     
 240   Head Flying Hours                             Pre-fail    offline               0                 100           1    100     100%  OK          -                    

外付けHDDの SMART も直ったー!

そんなわけで SMC て結構多種多様なトラブルに関わってくるんだなーと思い知った案件でした。めでたしめでたし。

Grafana & Graphite でRADIUSのログを可視化してみた 開発編

このエントリは「Grafana & Graphite でRADIUSのログを可視化してみた 概要編」の続きとなります。最初のエントリをご覧になってからお読みください。

miyalog.hatenablog.jp

さてこちらが本編。RADIUS認証ログ可視化ツール Radtail の開発にあたり、苦労した点、工夫した点を語らせて頂きます。

  • tail -f でログあつめ
  • マルチプロセス導入への道のり
    • Graphite データ上書き問題
    • そしてマルチプロセスへ
  • defaultdict で簡単集計
  • パフォーマンスチューニング
    • ベンチマークで現状把握
    • プロファイリングで原因特定
    • datetime.strptime 対策
    • multiprocessing.Queue 対策
    • チューニングの効果
  • Graphite 書き込み間に合わない問題
  • おわりに
続きを読む

Grafana & Graphite でRADIUSのログを可視化してみた 概要編

NetOpsCoding Advent Calendar 2016 @ Qiita 12/6 のエントリです。サービスの異常を素早く一目で把握できるよう、RADIUSサーバーのログを可視化するツールを作ったお話をします。

きっかけ

おはようございます!(午後6時) とある通信会社の委託でネットワークの監視業務をしている夜勤作業員です。(エンジニアじゃないよ)

f:id:miyahan:20161104004823p:plain

具体的にはこんな感じのCiscoの古い教科書によく載っているようなインターネットには直接繋がっていないネットワーク(いわゆる閉鎖網)を見ているのですが、サービスの正常性を確認する方法として、各ルーターTelnetshow pppoe session といったコマンドを叩いて、お客様のPPPoEセッションやLAC〜LNS間のL2TPトンネルが確立しているかをチェックします。ただこの作業は、

  • 障害の影響が広いときに何十台ものLAC/LNSを確認するのが辛い
  • 機種によってはCPUが弱く、コマンドの結果が表示されるまで数分待たされて辛い
  • コマンドではその時点の状態しか確認できず、切れたセッションなどが見えず辛い
  • grep辛い、というか無理

などなど多くの難点を抱えており、確認作業が大幅に遅れたり、見落としによるヒューマンエラーを起こしお客様からクレームを受けるなど問題が山積みでした。

過去にルーターに自動でログインしコマンドを叩き、結果をいい感じにグラフィカルに表示するWebアプリを作ってそれなりの効果があったのですが、大きな障害では結局ツールをルータの台数分実行しなければいけなかったり、ルーターCUIが遅い問題は如何ともし難く即時性に欠けるなど課題が残っていました。

そこでRADIUSサーバーの認証ログ・接続ログを使えないか?思い立ち、サービスの異常を素早く一目で把握すべく、ログを可視化するツール、名付けて「Radtail」(ラドテイル)を作ってみました。


Radtail 概要

ところで、先日行われた NetOpsCoding#3 で、日本Microsoft 北島さんの発表、Monitoring Intelligence に感銘を受け、それからというもの Grafana + Graphite をいじくり回しています。

www.slideshare.net

そんなわけで今回、データの収集・解析を自作の Python スクリプトで行いつつ、データの蓄積・描写にここぞとばかりと GraphiteGrafana を採用しました。

f:id:miyahan:20161116185907p:plainRadtail システム構成図

本ツールはマルチプロセス構成になっており、親プロセスである Control process、ログを収集する Collect process (サーバー台数分起動)、ログを集約・集計し Graphite に送信する Aggregate process が動作しています。

おおまかな流れは次の通りです

  1. RADIUSサーバーにSSHし、tail -F コマンドでログをリアルタイムに出力させる
  2. 出力されたログをパースし、さらにIPアドレスの逆引き等を行いデータを補完する
  3. データを Aggregate process のキューへ送信する
  4. キューバッファからデータを取り出し集計する
  5. 10秒ごとにデータを Graphite に送信する

なおツールは Supervisord を使ってデーモン化しています。

その結果を Grafana で描写させるとこうなります。いまのところ認証ログ(Access Accept / Reject)および、接続ログ(Accounting Start / Stop)を取り扱っています。

f:id:miyahan:20161104002147p:plain

いや~もう、こんなかっちょいいグラフが出るだけで既に大満足です。


サービス障害の見え方

ではこのツールでサービス障害はどのように見えるのでしょうか

LAGサイレント故障

LAC 〜 配下のL2スイッチ間は ACT - SBY モードのリンクアグリゲーションで構成しており、障害検出時に SBY 側に切り替わるようになっています。しかしログやコマンド上では正常に見えるのに、実はフレーム転送できていないというサイレント故障が起きることがまれによくあります。この事象が ACT 側で起きると、全てのパケットが故障した ACT 側に吸い込まれて二度と出てこないというブラックホール状態に陥り、当然お客様は通信できなくなってしまいます。

ツール試運用中にちょうどこの事象が起きたので、その際のスクリーンショットをご紹介します。

f:id:miyahan:20161116202127p:plainf:id:miyahan:20161116202130p:plain LAC全体のグラフ と 該当LAGのみにフィルタしたグラフ

5:14 から接続要求がゼロになっているので、ここから障害が発生したもとの推測されます。その5分後、5:19 にPPPのキープアライブタイムアウトが発生し切断処理が行われています。その後、関連部署からの連絡で障害を認知し、5:41 に保守者がLAGのアクティブポートを手動切り替えしサービスが回復しています。

もし Graphite のデータを定期的にチェックしアラートを出す手段を確立できれば、このようなサイレント故障をお客様や関連部門からのクレームではなく、監視部門が先に発見し対処することが出来るかもしれません。

ラインカード自己診断NG発生/回復

配下のL2スイッチでラインカードの自己診断NGのアラートが出て、数分後に自然回復するということがよくあります。この手のアラートは、主信号(お客様の通信)に影響がある場合と無い場合があり、もし影響があった場合は速やかにお客様に対しサービス中断発生の連絡をしなければなりません。つまり、なるべく早くサービス影響の有無を判断する必要があります。

サービス中断がある場合のグラフを示します

f:id:miyahan:20161116205432p:plain

アラートは 18:57 に発生しました。その瞬間から接続・切断処理が途絶えており、通信に影響があると判断できます。その後アラートは 18:59 に消えました。グラフを見ると 18:59:20 頃からお客様からの再接続要求が来て、切断と接続のイベント数がスパイクしています。

もしこれがコマンドによる確認だと、18:59:20 以降にお客様のPPPセッションが張り直されるまでサービス中断に気づくことができません。冒頭で述べた CLI が遅いルーターの場合はコマンドの結果が全て表示されるまで5分程度かかるため、障害発見まで10分を要してしまいます。

つまりこのツールを使うことで、サービス中断の確認作業が10分から10秒に短縮できるのです!

天災・広域停電

f:id:miyahan:20161124172629p:plain

2016年11月22日 5時59分、福島県沖で最大震度5弱地震が起き、各地で停電・瞬低が発生しましたが、今回作ったツールがこの影響をとらえました。地震発生から5分後の 6:04 に一気にタイムアウトによる切断処理が起きています。その後ちょろちょろと再接続されていき、15分ほどで平常通りに戻っています。

これはうまく使えば広域障害の検出・把握に使えそうですね。ただ現状だとサーバーが非力で、このグラフを出すのに3分もかかってしまうのが課題です・・・。

まとめ

  • グラフ化することで状況を “点” ではなく “線” で捉えることができ、直感的に異常が起きたことを把握できる
  • タイムアウトによるセッション切断を待つこと無く、接続・切断要求が途絶えることで異常に気づくことができる

今後の展望

今回ログをリアルタイムに処理し可視化することで、サービスの提供状況を簡単に・素早く・確実に把握できることがわかりました。ただそれは保守者が能動的にダッシュボードを開かなければならず、サイレント故障に対しては全くの無力です。

現在、異常の自動検出の方法を模索中です。Grafana で「ヤバいホスト Top 10」みたいなダッシュボードを作ってみても良いでしょうし、別にスクリプトを定期的に走らせて Graphite の API を叩いてデータを取り出して精査してアラートを出すのも良いかもしれません。

一番の問題はどうやって異常と判断するかです。数分〜十分単位の起伏があるうえ、1日の生活変動(朝7時頃に起床、午後7時頃に帰宅により増える)や曜日変動(休日は家に居るので変動が少ない)があり一概にしきい値や変動率を適用できません。このへん学問的な話になってくるので勉強が必要ですね。


なんだか業務改善事例の発表ようになってしまいましたが、最も語りたかったのは開発の苦労話で、後半エントリで述べています。ぜひ引き継ぎご覧ください。

miyalog.hatenablog.jp

Graphite のチューニングには札束しかなかった話

ネタバレ:SSDにしろ、以上。

そしてややネタエントリーです。

  • いきさつ
  • 速さが足りない!!
  • いいからチューニングだ!!
    • MAX_CACHE_SIZE
    • MAX_UPDATES_PER_SECOND
    • MAX_CREATES_PER_MINUTE
    • CACHE_WRITE_STRATEGY
    • WHISPER_AUTOFLUSH
    • WHISPER_SPARSE_CREATE / WHISPER_FALLOCATE_CREATE
    • WHISPER_LOCK_WRITES
    • WHISPER_FADVISE_RANDOM
  • 何の成果も得られませんでしたぁ!
    • SSDの場合
    • HDDの場合
  • 力こそパワー!
  • 余談:SSDなんですぐ死んでしまうん?
    • SSD TBW 比較

いきさつ

会社でRADIUSサーバーの認証ログを Grafana + Graphite で可視化するツールを作っていまして、開発版を会社の本番サーバーにデプロイしたところ、起動してから数分経つとデータが記録・表示されなくなる不具合が起きました。

サーバーから収集しているログをダンプしてみたり、Graphiteに送るデータをダンプしてみたり、いろいろデバッグしてみたものの原因がわからず途方に暮れてたのですが、結果的に Graphite の統計情報を見ることで原因が判明しました。その大活躍したダッシュボードがコチラ!

f:id:miyahan:20161111225731p:plain開発環境 (Fedora 24 on VirtualBox / 作業用Windows PC)

f:id:miyahan:20161111225746p:plain本番環境 (CentOS 6 on VMware vSphere Hypervisor / ブレードサーバー)

なんと本番環境ではメモリ使用量やキャッシュサイズがどんどん肥大し続けています!ちなみにこのまま放置したところ、そのうち過負荷でダッシュボードにデータがプロットされなくなり、最終的には carbon-cache が OOM killer 先生によって友愛されました。

なお、Graphite の統計情報・上記ダッシュボードについては関連エントリで詳しく述べています。

それにしてもダッシュボードを作ってる最中にダッシュボードの有用性を思い知るとは。いやはや。


速さが足りない!!

f:id:miyahan:20161117210602p:plain

よくよくダッシュボードを見てみると、受信したデータポイント(metricsReceived : 緑色) に対し、ディスク書き込んだデータポイント(committedPoints : 黄色) が大幅に少ないことがわかります。そう、ディスクへの書き込みが全く間に合っていないのです。書き込み回数 (updateOperations : 水色) を見てください。虫の息です・・・。

開発用PC VM 本番サーバー VM
ホストOS VirtualBox @ Windows 7 VMware vSphere Hypervisor
ゲストOS Fedora 24 CentOS 6.8
CPU / 割り当て 低電圧Core-i5 2GHz / 2core Xeon E7 2.4GHz / 8core
RAM割り当て 4GB 4GB
ストレージ SATA SSD SAS 10krpm HDD x2 RAID1

ではなぜ本番サーバーだけ書き込みが間に合っていないのでしょうか。最も考えられるのはストレージの違い。でもいくらHDDとはいえ、エンタープライズ向けの1万回転 SAS HDDです。いまどきディスクI/Oが間に合わずシステムが落ちるなんて起こりうるのでしょうか・・・?fio というツールでベンチマークを取ってみました。

f:id:miyahan:20161117214239p:plain

f:id:miyahan:20161117214641p:plain

ベタな結果ではありますが、HDDはシーケンシャルアクセスはそこそこなものの、ランダムアクセスがダメダメです。

f:id:miyahan:20161117215738p:plain

The Architecture of Open Source Applications: Graphite より

Graphite が採用する Whisper はファイルベースのデータベースで、1メトリック=1ファイルというシンプルな構成になっており、先頭のヘッダを読み込んで、その内容に基づき目的のデータポイントを読み書きしています。すなわち細かいリード/ライトが大量に走るということです。

上記ベンチマークでは、"Multi Random R/W" が最もその状況に近いでしょう。SSDパソコンは6000IOPS に対し、HDDサーバーは500IOPS・・・。これはたしかに書き込み間に合わないかも。SSDがこのくらい速いのは分かるのですが、本番サーバーの1MB/sってなんだよ、数年前の低価格パソコンかよ・・・。エンタープライズ 10krpm SAS ってなんだったんだよ・・・。

f:id:miyahan:20161117221814p:plain

続きを読む

Graphite / Carbon の統計情報を読み解く

f:id:miyahan:20161116181011p:plain

Graphite の データ記録を担う Carbon には自身の統計情報を自身のデータベースに記録する機能があります。以前パフォーマンス問題の調査のためにこれを使ったのですが、各パラメーターが何を意味しているのか、ドキュメントを探したものの見つからず苦労しました。

そこで、記録された実データや、設定変更に伴う挙動から「たぶんこうだろう」と思うところをメモとして残しておきます。もしお役に立てば幸いです。また、公式ドキュメントのありかや有用な情報をご存じの方、誤りを見つけた場合はぜひコメントください。

  • Carbon statistics の設定
  • cpuUsage / memUsage
  • avgUpdateTime
  • metricsReceived / committedPoints
  • updateOperations / pointsPerUpdate
  • cache.queues / cache.size
  • cache.queries

Carbon statistics の設定

この機能はデフォルトでONになっているので、何をしなくてもすぐ使えます。ちなみに /etc/carbon/carbon.conf で明示的に設定することができます。

# By default, Carbon itself will log statistics (such as a count,
# metricsReceived) with the top level prefix of 'Carbon' at an interval of 60
# seconds. Set CARBON_METRIC_INTERVAL to 0 to disable instrumentation
CARBON_METRIC_PREFIX = carbon  # デフォルトでは carbon.**** のメトリックで記録される
CARBON_METRIC_INTERVAL = 60  # デフォルトでは60秒間隔で記録される

初期設定ではログを90日間保存するようになっています。これを変更する場合は /etc/carbon/storage-schema.conf を編集してからデータベースを再構築してください。

[carbon]
pattern = ^carbon\.
retentions = 60:90d
続きを読む