職場でコーヒー会はじめました

こんにちは、とある通信会社の委託でネットワークの監視・保守をやっている作業員です(エンジニアじゃないよ)。 今回は職場にコーヒーメーカーを買って飲みものを共同購入する営みを始めた話をします。 夜勤を含む24時間体制で監視業務を行っている特殊な職場の事例ではありますが参考になれば幸いです。


「缶コーヒー代って結構バカにならないよね−」
それは同僚の何気ないひとことから始まりました。

職場の休憩室に設置されている自販機は缶が110円・ペットボトルが140円で売られています。110円の缶コーヒーを1日1本飲むと月平均2,200円となかなかの金額になる上に、夜勤時の冷え込む時間には暖かいジョージア紅茶花伝が飲みたくなるものですが夏場は「つめた〜い」飲みものしかないなどの不満がありました。そんなとき同僚の一言から「じゃあ自前で用意するか」と "コーヒー会" をスタートさせました。

というわけで達成すべき目的は2つ:

  1. 缶コーヒーよりもリーズナブルにコーヒーを飲めるようにすること(同僚の主目的)
  2. 監視ルームですぐ淹れられるようになること(私の主目的、詳しくは後述)

設備構築&会費検討

いきなりコーヒーメーカーを買うのは無理があるので、まずはスロースタートということでインスタントコーヒーから始めることに。とりあえず電気ポットやカップスタンド、カップホルダー、ディスペンサー、小物入れなどを自腹で買いそろえました。

f:id:miyahan:20171215112839j:plain

ストリックスデザイン カップホルダー 5P ブラック

ストリックスデザイン カップホルダー 5P ブラック

山佳化成 ワンタッチシュガーポット

山佳化成 ワンタッチシュガーポット

バスケット: バスケット ナチュラルウッド ハーフ | ニトリ公式通販 家具・インテリア・生活雑貨通販のニトリネット

さらに家でホコリを被っていた Nestle ネスカフェバリスタ も引っこ抜いてきて休憩室の自担当冷蔵庫脇に設置。ちなみにワイヤーラックも購入。

f:id:miyahan:20171215123640j:plain

昼間は休憩室にあるネスカフェバリスタを使ってもらい、夜勤時は上記のバスケットを監視ルーム(一応飲食禁止)に持ち込んで電気ポットですぐインスタントコーヒーが飲めるようにする目論見です。

次に会費の検討です。試算したところ1杯15円ランニングコストがかかることがわかりました。

項目 単価 購入品
インスタントコーヒー 6.4円 AGF マキシム 135g 429円 ヨーカドーセール
ノンカロリー甘味料 2.6円 シュガーカット顆粒ゼロ 1kg 2619円
クリーミーパウダー 2.1円 ネスレ ブライト 400g×2袋 549円
紙コップ 7oz 3.0円 日本デキシー 紙コップ205ml 50個入 149円
マドラー 0.9円 木製コーヒーマドラー 200本入 184円
合計 15.0円 -

日勤時には1杯/日・夜勤時には2杯/泊で月15杯飲むのをモデルケースとし225円/人・月。この試算から会費を500円/月とし、出た利益から立て替えた初期投資分(1.5万円)をペイしていくことにしました。

ピッチャー型電気ポット is 神

今年の6月、監視業務に従事している夜勤メンバーに声をかけたところ10人の希望者が集まりコーヒー会が運用がスタートしました。

実際に運用してみると電気ポットが予想以上に便利で捗りました。休憩室は監視ルームからやや遠いうえに静脈認証ドアを通らないといけないため移動コストが高かったのですが、電気ポットを置いたことで思い立ったらすぐ熱々のコーヒーが飲めると大好評でした。

象印 沸とう電気ポット 1.0L CH-DT10-XJ ステンレスブラウン

象印 沸とう電気ポット 1.0L CH-DT10-XJ ステンレスブラウン

ちなみに一般的な電気ポットでもなく電気ケトルでもなく、なぜピッチャーの形をした電気ポットを買ったというと、

  • 電気ポットを置くと他担当から「なにそんなの持ち込んでるの?」とクレームが入る恐れがあるが、ピッチャー形なら「お冷や入れです!!」とごまかせそう
  • 電気ポット・電気ケトルは消費電力が1.5kWと高くブレーカーが飛ぶ恐れがあったが、この製品は沸くのは遅いが430Wと低いので安心
  • 一般的な電気ケトルは沸かすだけだが、この製品は保温機能があるのでいつでもお湯が出る

などの理由がありました。要するに電気ポットと電気ケトルをいいとこどりな製品だったんです。実際その狙いは大いに当たりました。

なお、もしもの時の設備影響・感電を防止するために漏電保護タップを取り付けてあります。

一方で想定が外れたのがネスカフェバリスタが全く使われなかったこと。最初は物珍しさにしばしば使われていたのですが、1ヶ月もしないうちに全く稼働しなくなりいつのまにかインスタントコーヒーが湿気って固まっていました。まあ身も蓋もない言い方をすればただのインスタントコーヒー溶かし機なので、ふつうにポットでお湯を注いでかき混ぜたほうが早くて楽なんです。

インスタントコーヒーディスペンサーを導入したことで瓶をあけてスプーンで規定量を測る手間が無くなり、傾ければ1杯分の粉が出てくる便利さもバリスタ離れに一役買ったような気がします。

ライバル、本格ミル挽きコーヒー出現

お財布の負荷は減り、いつでも暖かいコーヒーが飲めると喜んでいた矢先、突如ライバルが出現します。休憩室に本格ミル挽きコーヒーのカップ自販機(トーヨーペンディング アドマイヤ)が導入されたのです。

f:id:miyahan:20171215124525j:plainf:id:miyahan:20171215124530j:plain

1杯180〜280円と強気の価格設定でしたが、実際飲んでみるととても美味い。くやしい…でも買っちゃう…!! この刺客により再び我々の財布は厳しくなっていきました。アンケートを取ったところ「会費を上げてもいいので、もっとおいしいのコーヒーを飲みたい」という意見が多かったため、初期の「コーヒー代をとにかく安く」というポリシーを「美味しいコーヒーを安く」に改め、我々も対抗して本格ミル挽きコーヒーに参入することにしました。

コーヒーメーカーは デロンギ マグニフィカ S ECAM23120BN を迷わず選定。というのもコーヒー殻を捨てる行程を含めたフルオートで現実的な価格という条件だとデロンギくらいしか見つかりませんでした。またこのモデルはエントリーモデルに無い「カフェ・ジャポーネ」という蒸らし行程を入れドリップコーヒー風のテイストが味わえるモードが用意されているのがポイントでした。一方でさらに上位のモデルなら全自動でカフェラテやカプチーノが作れるのですが、牛乳の管理など衛生上の課題が拭えないことから見送りました。スチームノズルが付いてるので、やる気があれば自分でミルクフォームが作れますしね。

またアンケートで「コーヒーが飲めないので、緑茶や紅茶があるとうれしい」という意見を何人かからもらったのでティーバッグをラインナップに加えることにしました。

f:id:miyahan:20171215132711j:plain

ファミレスのドリンクバーを再現したく、無印商品でアクリル製引き出し を買ってきて、ティーバッグの化粧箱を切り抜いてペタペタ。かなりそれっぽくなったんでしょうか?

また紙コップが小さい・すぐ冷めてしまうという意見があったことから、大容量で断熱性に優れるフタつき紙コップに変更。

これらの変更によりコストが63円/杯に跳ね上がり 948円/月・人に。このことから会費を1,000円/月に値上げ。会員数10名で毎月の利益が520円。今回追加投資した10万円の回収に約16年かかる計算です。その前に確実に異動すると思います。(多分に個人的趣味と野望が入っているので端から黒字にしようとは思っていません)

項目 単価 購入品
コーヒー豆(15g) 38.0円 KALDI スペシャブレンド 200g 507円
ノンカロリー甘味料 2.6円 シュガーカット顆粒ゼロ 1kg 2619円
クリーミーパウダー 2.1円 ネスレ ブライト 400g×2袋 549円
紙コップ 14oz 12.6円 サンナップ 厚紙カップ 400ml 50個入 486円
紙コップ フタ 7.0円 サンナップ 厚紙カップ用フタ 100個入 224円
マドラー 0.9円 木製コーヒーマドラー 200本入 184円
合計 63.2円 -

コーヒー会ここに完成

f:id:miyahan:20171215134745j:plain

コーヒー会発足から半年。ついに思い描いていた完成形に達することができました。挽き立てのコーヒー豆から淹れたエスプレッソは本当に美味しく、さらに追加投資してキャラメルソースやチョコレートソースと買って職場内カフェを作りたい欲望まで出てきました。

緑茶や紅茶も少しグレードの高いものを選定したためかこれまた美味い。真夜中のひもじい時に飲む香ばしい玄米茶は身体に染みます。紅茶の華やかな香りもリラックスにとても最適。

飲みもののクオリティがあがったことで、休憩のクオリティが上がり、ひいては業務のパフォーマンスや職場生活品質の向上が図れればと思います。

コーヒー会ポータルサイト

f:id:miyahan:20171215141311j:plain

最後に技術っぽい話を。

会員からお金をもらって運営するという性質上、金や物の流れを透明化したいモチベーションからポータルサイトを作りました。ベタに Excel で管理しても良かったのですが、会社外で閲覧・編集ができない(かといって社内では Dropbox などのストレージや、Office 365 や Google スプレッドシート などのオンラインアプリは遮断されており利用できず)のでフレームワークの勉強も兼ねてWebサイトにしました。

私が借りているレンタルサーバーでは RubyPython がまともに動かないので実質 PHP 一択。CakePHP あたりが有名ですが、Google トレンドを見ると Laravel が近年圧倒的人気なようだったので選定。

f:id:miyahan:20171215142018j:plain f:id:miyahan:20171215142022j:plain f:id:miyahan:20171215142026j:plain f:id:miyahan:20171215142029j:plain

会員の管理や会費の納付状況、全体の財政状況、消耗品のストック状況などを管理・閲覧できるようにしています。

図らずもユーザーの登録・認証、データベースから在庫情報を取ってきたり更新したりとWebアプリケーションの基本的エッセンスが多く含まれており学習課題としてかなり優秀なんじゃないでしょうかこれ。

なおラインナップの紹介やコーヒー会の概要など部外者に見られてもよい情報は認証無し、内部情報を伴うページはユーザー認証有りとしました。ユーザー登録は部外者にされては困るので会社のメールアドレスのみを許容し、そのメールアドレスに書かれた認証ページを踏まないと登録が完了しないようにしました。まあ普通ですね。

ちなみに今回使った Laravel ですが、バージョンが 0.1 違うだけでクラスの構成やメソッド名、CLIコマンド等が大きく異なりリファレンスが役に立たないし、互換性も低い。さらにフルスタックWAFにしては機能が足りておらず、上記のメール認証も自前で書く必要がありました。フレームワークとは何だったのか…。たしかに作りは今風ですが、発展途上でプロダクションで使うには時期尚早だなと感じました。そしてなにより動作がもっさり。おとなしく CakePHP で作れば良かった…。


勉強会などでイケてるIT企業におじゃまするたび、休憩室にドリンクバーがあったり、社内カフェがあったり、バランスボールや畳があったりと憧れの的でしたが、それが自分の会社でも少しではありますが達成できたのです。

プール金マイナス11万に少し青ざめたりもしたけれど、野望が叶って私は満足です。コーヒーおいしいです。^q^


余談:お紅茶

これまで紅茶の種類なんて意識したことが無かったのですが、今回を機にちょっとダージリンとアッサムを飲み比べてみました。

f:id:miyahan:20171215212313j:plain

左がダージリン、右がアッサム。抽出のスピードから色まで全然違います。アッサムは全体的に味が濃く穀物茶のようなテイスト。ダージリンは華やかな香りと透き通ってまっすぐな渋み・えぐみがあります。個人的にはダージリンの方が紅茶のイメージ通りな香りと味で好きです。

f:id:miyahan:20171215212314j:plain

しかしミルクを入れると方向性が全く変わります。ダージリンはミルクに負けてなんだかパっとしない味になりますが、一方でアッサムは香りや渋みが引き立ってミルクとよく馴染んでいます。ミルクティーにするなら圧倒的にアッサムですね。

こんな違うもんなんですねー。

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

続きを読む