miyalog 2019-12-08T13:25:48+09:00 miyahan Hatena::Blog hatenablog://blog/10328537792369753295 やっぱりNTT東日本の「個人PC等点検」はやっちゃダメだと思う hatenablog://entry/26006613478165791 2019-12-08T13:25:48+09:00 2019-12-11T09:00:09+09:00 先日、NTT東日本グループが従業員に対し、個人所有のPC等に会社指定の検閲ソフトを導入させてプライベートなデータの検査や、会社が指定したソフトウェアを利用できないようシステムに細工するセキュリティ向上施策を実施していたことが明らかになりSNSで話題になりました。本エントリは複数の資料から施策の詳細を明らかにし、いくつかの判例を参考にそれが問題ないのかを考察します。 <p>先日、<a class="keyword" href="http://d.hatena.ne.jp/keyword/NTT%C5%EC%C6%FC%CB%DC">NTT東日本</a>グループが従業員に対し、個人所有のPC等に会社指定の検閲ソフトを導入させて<strong>プライベートなデータの検査や、会社が指定したソフトウェアを利用できないようシステムに細工するセキュリティ向上施策</strong>を実施していたことが明らかになり<a class="keyword" href="http://d.hatena.ne.jp/keyword/SNS">SNS</a>で話題になりました。</p> <p><iframe src="https://hatenablog-parts.com/embed?url=http%3A%2F%2Fntt-workers.net%2Ftop%2F2016%2F2016top.html" title="NTT労働者" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;"></iframe><cite class="hatena-citation"><a href="http://ntt-workers.net/top/2016/2016top.html">ntt-workers.net</a></cite> (<code>16.11.18 N関労東 秋闘要求書を提出</code> の項)</p> <p>さらにその後、<a class="keyword" href="http://d.hatena.ne.jp/keyword/ITmedia">ITmedia</a> が取材を行ない、同社は内容を否定しました。</p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fnlab.itmedia.co.jp%2Fnl%2Farticles%2F1904%2F16%2Fnews009.html" title="NTT東、「社員の個人PCに検閲ソフトを導入」SNS投稿を「事実と異なる」と否定" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;"></iframe><cite class="hatena-citation"><a href="https://nlab.itmedia.co.jp/nl/articles/1904/16/news009.html">nlab.itmedia.co.jp</a></cite></p> <p>しかし上記の記事には「いや、やっぱり検閲してんじゃん」、「(<a class="keyword" href="http://d.hatena.ne.jp/keyword/SNS">SNS</a>で言われていたことは)だいたいあってる」などと多くのコメントが多く寄せられている通り、なにが「事実と異なる」のかいまいち見えません。そこで本エントリでは同社の社員に配布された資料や<a class="keyword" href="http://d.hatena.ne.jp/keyword/%CF%AB%C6%AF%C1%C8%B9%E7">労働組合</a>の提言を参考に何が行われているのか、さらにいくつかの<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C8%BD%CE%E3">判例</a>を参考にそれは問題ではないのかを考えてみたいと思います。</p> <p>なお当方は法の専門家ではないド素人です。合法性の正確な判断は行えず、またその責任も負えないことを予めご了承ください。また本記事で引用する各資料は表記の組織から公開されたオリジナルのものである前提で話を進めることをご留意ください。</p> <h2>何が行われているのか: 個人データ検査とPC利用制限</h2> <p>まず、そもそもこの施策は一体何が行われているのか確認します。</p> <p>資料1. 取材記事:</p> <blockquote><p>同社では点検ツールを提供。このツールではPC内の「会社情報の有無」「<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A6%A5%A4%A5%EB%A5%B9%C2%D0%BA%F6">ウイルス対策</a>ソフトの有無」「<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D5%A5%A1%A5%A4%A5%EB%B8%F2%B4%B9%A5%BD%A5%D5%A5%C8">ファイル交換ソフト</a>の有無」をチェック可能で、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D5%A5%A1%A5%A4%A5%EB%B8%F2%B4%B9%A5%BD%A5%D5%A5%C8">ファイル交換ソフト</a>が検出された場合は、社員個々人が当該ソフトにチェックを入れることで利用制限がかけられるようになっていると同社広報は説明しています。 <cite><a href="https://nlab.itmedia.co.jp/nl/articles/1904/16/news009.html">NTT&#x6771;&#x3001;&#x300C;&#x793E;&#x54E1;&#x306E;&#x500B;&#x4EBA;PC&#x306B;&#x691C;&#x95B2;&#x30BD;&#x30D5;&#x30C8;&#x3092;&#x5C0E;&#x5165;&#x300D;SNS&#x6295;&#x7A3F;&#x3092;&#x300C;&#x4E8B;&#x5B9F;&#x3068;&#x7570;&#x306A;&#x308B;&#x300D;&#x3068;&#x5426;&#x5B9A; - &#x306D;&#x3068;&#x3089;&#x307C;</a></cite></p></blockquote> <p>資料2. 従業員向け資料:</p> <blockquote><p>①上記環境に会社情報が存在しないこと<br/> ②上記対象のPCに<a class="keyword" href="http://d.hatena.ne.jp/keyword/Winny">Winny</a>、Share等情報漏洩の危険性が高いソフトが利用できないこと<br/> ③会社情報を手段を問わず無断で持ち出していないこと <cite><a href="http://ntt-workers.net/top/2016/161118/161111_higashi-pc.pdf">NTT東日本 平成28年度 個人PC等点検の実施について(PDF)</a></cite></p></blockquote> <p>上記ソースの内容は概ね一致しており、下記3点を実施させているようです。</p> <ol> <li>個人所有のPC等に保存されたデータに会社情報が含まれていないかを検査</li> <li>個人所有のPC等に<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A6%A5%A4%A5%EB%A5%B9%C2%D0%BA%F6">ウイルス対策</a>ソフトがインストールされているかを確認</li> <li>個人所有のPC等で会社が指定したソフトウェアが利用できないよう細工</li> </ol> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A6%A5%A4%A5%EB%A5%B9%C2%D0%BA%F6">ウイルス対策</a>ソフトのチェックについては<a class="keyword" href="http://d.hatena.ne.jp/keyword/%CA%BF%C0%AE28%C7%AF">平成28年</a>の社員向け資料には記載がないため、最近追加されたものかもしれません。</p> <h2>点検対象は何か: 全ての個人利用ITリソース</h2> <p>取材記事への読者コメントで「業務で使ってるPCなら妥当では?」、「BYODのデ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%A4%A5%B9">バイス</a>に<a class="keyword" href="http://d.hatena.ne.jp/keyword/MDM">MDM</a>相当のソフトが導入されているのは仕方ない」といった意見がありますが、これは誤りです。</p> <blockquote><p>点検対象: <a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AF%A5%E9%A5%A6%A5%C9">クラウド</a>サービス等を含む社員個人が利用する全てのPC等の環境<br/> <例>パソコン/外付けHDD/<a class="keyword" href="http://d.hatena.ne.jp/keyword/NAS">NAS</a>等サーバ/USB/<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%DE%A1%BC%A5%C8%A5%D5%A5%A9%A5%F3">スマートフォン</a>/<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%BF%A5%D6%A5%EC%A5%C3%A5%C8">タブレット</a>/<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AF%A5%E9%A5%A6%A5%C9">クラウド</a>サービス<br/> <cite><a href="http://ntt-workers.net/top/2016/161118/161111_higashi-pc.pdf">NTT東日本 平成28年度 個人PC等点検の実施について(PDF)</a></cite></p></blockquote> <p>同記事には明確な定義が書かれていませんが、従業員向け資料では対象を「社員個人が利用する全てのPC等の環境 」としており、<strong>会社の業務や機密情報と全く関係ないゲーミングPCやリビングにある家族共用PC、オンラインサービス、お宝データを保存したリムーバブルHDDなども対象</strong>になると思われます。</p> <p>それにしても、なぜおじさんは「<a class="keyword" href="http://d.hatena.ne.jp/keyword/USB%A5%D5%A5%E9%A5%C3%A5%B7%A5%E5%A5%E1%A5%E2%A5%EA">USBフラッシュメモリ</a>」を「USB」と略すのか…。</p> <h2>任意か強制か: 直接雇用者は強制</h2> <p>資料1. 取材記事 :</p> <blockquote><p>個人PCに会社情報が入っていないかなどを、<strong>社員に自主的に点検してもらっている</strong><br/> <cite><a href="https://nlab.itmedia.co.jp/nl/articles/1904/16/news009.html">NTT&#x6771;&#x3001;&#x300C;&#x793E;&#x54E1;&#x306E;&#x500B;&#x4EBA;PC&#x306B;&#x691C;&#x95B2;&#x30BD;&#x30D5;&#x30C8;&#x3092;&#x5C0E;&#x5165;&#x300D;SNS&#x6295;&#x7A3F;&#x3092;&#x300C;&#x4E8B;&#x5B9F;&#x3068;&#x7570;&#x306A;&#x308B;&#x300D;&#x3068;&#x5426;&#x5B9A; - &#x306D;&#x3068;&#x3089;&#x307C;</a></cite></p></blockquote> <p>資料2. 従業員向け資料 :</p> <blockquote><p>【点検対象社員】<br/> 役員(取締役及び<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B4%C6%BA%BA%CC%F2">監査役</a>)、社員、相談役、顧問、特別参与、臨時雇い、常勤嘱託、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B7%C0%CC%F3%BC%D2%B0%F7">契約社員</a>及び、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B7%C0%CC%F3%BC%D2%B0%F7">契約社員</a>※3<br/> ※3:<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C7%C9%B8%AF%BC%D2%B0%F7">派遣社員</a>は、派遣会社及び、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C7%C9%B8%AF%BC%D2%B0%F7">派遣社員</a>から実施の同意を得られた方のみ対象。<br/> 【点検時の服務】<br/> 社員:<strong>業務命令による点検</strong><br/> <a class="keyword" href="http://d.hatena.ne.jp/keyword/%C7%C9%B8%AF%BC%D2%B0%F7">派遣社員</a>: 勤務時間扱いとしない <cite><a href="http://ntt-workers.net/top/2016/161118/161111_higashi-pc.pdf">NTT東日本 平成28年度 個人PC等点検の実施について(PDF)</a></cite></p></blockquote> <p>資料3: <a class="keyword" href="http://d.hatena.ne.jp/keyword/%CF%AB%C6%AF%C1%C8%B9%E7">労働組合</a>資料:</p> <blockquote><p><strong>個人所有等パソコンの自己点検の強要</strong>は行わず、自主点検とすること。 <cite><a href="http://ntt-workers.net/top/2016/161118/161114_higashi-16-01.pdf">東日本電信電話株式会社宛 東日本NTT関連合同労働組合 秋闘要求書 N関労東第16-01号(PDF)</a></cite></p></blockquote> <p>そして本問題の要となる施策が強制か否かについては、取材記事とそのほかの情報で全く異なることが書かれています。当事者たる従業員向けに書かれた資料で <strong><code>業務命令</code> としっかり明記されているため強制であることは間違いない</strong>でしょう。また <code>派遣社員は(中略)同意を得られた方のみ</code> という記述からも、それ以外の直接雇用者は全員強制と解釈するのが妥当です。さらに<a class="keyword" href="http://d.hatena.ne.jp/keyword/%CF%AB%C6%AF%C1%C8%B9%E7">労働組合</a>が点検の強要に抗議していることも一般的に考えられる "任意"、"自主的" とは大きくかけ離れている事実を証明しています。</p> <p>すなわちこの時点で取材記事で弁護士より示された</p> <blockquote><p><strong>自主的</strong>かつ対象を絞った年に1回という妥当な方法と程度で、明示した制度として全社員に対し実施されているとのことですので、本件の点検は業務として正当と認められるでしょう。<br/>  (中略)<br/> 「<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D5%A5%A1%A5%A4%A5%EB%B8%F2%B4%B9%A5%BD%A5%D5%A5%C8">ファイル交換ソフト</a>」に絞って、強制ではなく<strong>社員の任意に基づく</strong>チェックを入れることでの制限という相当な手段であれば、社員の財産権などを不当に制約するものとまではいえない</p></blockquote> <p>と正当とみなす見解の前提条件を満たせなくなります。(ただし、任意ではないとアウトなのか、それとも任意だとより望ましいという意味なのかはこの文章からは読み取れません。)</p> <p>それにしてもなぜ取材記事で<strong><a class="keyword" href="http://d.hatena.ne.jp/keyword/NTT%C5%EC%C6%FC%CB%DC">NTT東日本</a>の広報が「自主的」とウソを言った</strong>のか理解に苦しみます。もし発端となった資料の公開時(<a class="keyword" href="http://d.hatena.ne.jp/keyword/%CA%BF%C0%AE28%C7%AF">平成28年</a>)には強制だったが今は任意になったのであればそう説明されるはずですし、もし 自主的==セルフ点検 という意味で発言したのだとしても <a class="keyword" href="http://d.hatena.ne.jp/keyword/%C2%E7%BC%AD%CE%D3">大辞林</a> 第三版に <code>じしゅ【自主】( 名 ) 他人の保護や干渉を受けず、自分の判断で行動すること。</code> とあるように意味的に不適です。強要していることを隠し問題性の追求や批判を避けたかったのではないかと勘ぐってしまいます。</p> <p>余談ですがこの<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C7%C9%B8%AF%BC%D2%B0%F7">派遣社員</a>だけは "任意" というのが憎たらしいですね。法令や<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B8%DB%CD%D1%B7%C0%CC%F3">雇用契約</a>上の制約を回避する目的と邪推しますが、正社員より弱い立場につけ込み事実上の強制で行わせ、終いには<strong>業務命令じゃなくてあくまで任意だから派遣はタダ働き</strong>というのが何ともやるせない気持ちになります…。</p> <h2>会社と個のプライバシーに関わる<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C8%BD%CE%E3">判例</a></h2> <p>さて、ここまでで<a class="keyword" href="http://d.hatena.ne.jp/keyword/NTT%C5%EC%C6%FC%CB%DC">NTT東日本</a>は社員の個人PC等に対しデータの検査やPCの一部機能制限を強制していることがわかりました。問題はこれらが適法であるかどうかです。</p> <p>取材記事では弁護士が<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C8%BD%CE%E3">判例</a>を挙げて正当であるとの考えを示しましたが、そもそも前提が崩れてしまっているし、考察も不十分だと感じました。そこで強制検査に関わる事例をいくつか見てヒントを探ってみることにしましょう。</p> <h3>会社から貸与されたメールアカウント上で送受信された私用メールの検査: 合法</h3> <p>社内(会社資産上のデータ・業務時間内の行動)における<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D7%A5%E9%A5%A4%A5%D0%A5%B7%A1%BC%B8%A2">プライバシー権</a>は残念ながらある程度制限されるものと考えるのが一般的です。<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B8%FC%C0%B8%CF%AB%C6%AF%BE%CA">厚生労働省</a>・<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B7%D0%BA%D1%BB%BA%B6%C8%BE%CA">経済産業省</a>は <a href="https://www.meti.go.jp/policy/it_policy/privacy/downloadfiles/161228kojoguideline.pdf">個人情報の保護に関する法律についての経済産業分野を対象とするガイドライン</a> で従業者のモニタリングを行う場合は予め社内規程を定め従業者に明示することを求めていますが、これに即していない事例においても多くの訴えが棄却されています。</p> <p>例えば社用メールアカウントにおける私的メールを無断で検査されたことを争った <a href="https://www.zenkiren.com/Portals/0/html/jinji/hannrei/shoshi/07886.html">F社Z事業部事件</a>(<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C5%EC%B5%FE%C3%CF%BA%DB">東京地裁</a> 2001年12月3日判決) で裁判所は</p> <blockquote><p>監視の目的、手段及びその態様等を総合考慮し、監視される側に生じた不利益とを比較衡量の上、社会通念上相当な範囲を逸脱した監視がなされた場合に限り、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D7%A5%E9%A5%A4%A5%D0%A5%B7%A1%BC%B8%A2">プライバシー権</a>の侵害となると解するのが相当である。</p></blockquote> <p>とし、具体的に下記のような不適切な手段で監視を行った場合においてのみプライバシー侵害となると判断しました。</p> <ol> <li>職務上従業員の電子メールの私的使用を監視するような責任ある立場にない者が監視した場合</li> <li>責任ある立場にある者でも、これを監視する職務上の合理的必要性が全くないのに専ら個人的な好奇心等から監視した場合</li> <li>社内の管理部署その他の社内の第<a class="keyword" href="http://d.hatena.ne.jp/keyword/%BB%B0%BC%D4">三者</a>に対して監視の事実を秘匿したまま個人の恣意に基づく手段方法により監視した場合</li> </ol> <p>ほかにも社内から誹謗中傷メールが送信された事件の調査方法を争った <a href="https://www.zenkiren.com/Portals/0/html/jinji/hannrei/shoshi/07916.html">日経クイック情報事件</a>(<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C5%EC%B5%FE%C3%CF%BA%DB">東京地裁</a> 2002年2月26日判決) では、次のように述べられています。</p> <blockquote><p>業務に必要な情報を保存する目的で会社が所有し管理するファイルサーバー上のデータの調査であり、かつ、このような場所は、会社に持ち込まれた私物を保管させるために貸与されるロッカー等のスペースとは異なり、業務に何らかの関連を有する情報が保存されていると判断されるから、上記のとおりファイルの内容を含めて調査の必要が存する以上、その調査が社会的に許容し得る限界を超えて原告の精神的自由を侵害した違法な行為であるとはいえない。<br/> (中略)<br/> さらに、上記調査目的に照らして、結果としては誹謗中傷メール事件にも、私用メール事件にも関係を有しない私的なファイルまで調査される結果となったとしても、真にやむを得ないことで、そのような情報を入手してしまったからといって調査自体が違法となるとはいえない。</p></blockquote> <h3>勤務中・退勤時の所持品検査: 合法</h3> <p>次に、よりセンシティブな私物の検査について見ていきます。所持品検査に関しては <a href="https://www.zenkiren.com/Portals/0/html/jinji/hannrei/shoshi/01736.html">西日本鉄道事件</a>(<a class="keyword" href="http://d.hatena.ne.jp/keyword/%BA%C7%B9%E2%BA%DB">最高裁</a> 1968年8月2日判決) がモデルケースとなっており、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%BA%C7%B9%E2%BA%DB">最高裁</a>は <code>いわゆる所持品検査は、被検査者の基本的人権に関する問題であって、その性質上つねに人権侵害のおそれを伴うものである</code> と強い懸念を示し、やむを得ず行う場合は次の4つの要件を満たさなければならないとしました。</p> <ol> <li>検査を必要とする合理的理由があること</li> <li>一般的に妥当な方法と程度で行われること</li> <li>制度として職場従業員に対して画一的に実施されること</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%BD%A2%B6%C8%B5%AC%C2%A7">就業規則</a>など明示の根拠に基づいて行なわれること</li> </ol> <p>この後に続く多くの事例もこの4大原則に基づいてジャッジされています。</p> <ul> <li><a href="https://www.zenkiren.com/Portals/0/html/jinji/hannrei/shoshi/03665.html">東陶機器事件</a>(<a class="keyword" href="http://d.hatena.ne.jp/keyword/%CA%A1%B2%AC%C3%CF%BA%DB">福岡地裁</a> 1971年2月12日判決): 退門時の所持品検査を拒否し解雇 → 検査は合法</li> <li><a href="https://www.zenkiren.com/Portals/0/html/jinji/hannrei/shoshi/01796.html">帝国通信工業事件</a>(<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B2%A3%C9%CD%C3%CF%BA%DB">横浜地裁</a> 1975年3月3日判決): 退門時の所持品検査を拒否し解雇 → 検査は合法</li> <li><a href="https://www.zenkiren.com/Portals/0/html/jinji/hannrei/shoshi/03311.html">サンデン交通事件</a>(山口地裁 1979年10月8日判決): バス乗務員に対し物品検査を行った → 身体をまさぐるなどして屈辱を与える検査は違法</li> <li><a href="https://www.zenkiren.com/Portals/0/html/jinji/hannrei/shoshi/05829.html">日立物流事件</a>(浦和地裁 1991年11月22日判決): 職場での物品紛失に際し、作業にあたっていた従業員に対し所持品検査を行った → <a class="keyword" href="http://d.hatena.ne.jp/keyword/%BD%A2%B6%C8%B5%AC%C2%A7">就業規則</a>等に明記がないため検査は違法</li> </ul> <h3>職場・勤務時間外の所持品検査: 違法</h3> <p>最後に所持品検査の特殊ケースを紹介します。<a href="https://www.zenkiren.com/Portals/0/html/jinji/hannrei/shoshi/03621.html">芸陽バス事件</a>(<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B9%AD%C5%E7%C3%CF%BA%DB">広島地裁</a> 1972年4月18日判決) はバス乗務員である原告が業務を終え所定の所持品検査を完了してから帰宅する際、上司から自家用車(通勤に使用)の検査を追加で求められたがこれを拒否し解雇された事案を争った裁判です。裁判所は、</p> <blockquote><p>検査の対象となるものは乗務と密接に関連するもの、すなわち、服装検査のほか、乗務に際し会社から命ぜられて業務上携帯した物品、乗務に際し特に携帯した私物に限られる。乗務員が通勤に使用する自家用車内は、<strong>完全に個人の領域であるから、原則的には検査の対象とならない</strong>。</p></blockquote> <p>とし所持品検査の対象を明確にしました。また次のような場合に限り自家用車の検査を求めることができるとしました。</p> <ul> <li>所持品検査前あるいは所持品検査中に、係員の許可なく乗務員が自家用車内に乗り込んだとき</li> <li>係員の許可なく乗務員が検査の対象になる私物などを自家用車内に持ち込んだとき</li> <li>乗務員が許可なく自家用車内に乗り込んだうえ車内に金品を隠したり、許可なく私物などを持ち込んだうえその中の金品を隠したりするように、車内において不正取得を疑わせる客観的な行為をしたとき</li> </ul> <p>これは4大原則における ①:検査を必要とする合理的理由があること を満たしているかどうかを問いています。 (なお判決では加えて、もし原告を狙い撃ちして検査を求めたのであれば ③: 制度として職場従業員に対して画一的に実施されること も満たしていない可能性があると指摘しています。)</p> <h2><a class="keyword" href="http://d.hatena.ne.jp/keyword/NTT%C5%EC%C6%FC%CB%DC">NTT東日本</a>の個人PC等強制点検は適法か</h2> <p><figure class="figure-image figure-image-fotolife" title="NTT東日本の個人PC等点検と類似判例の比較"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20191208/20191208055007.png" alt="f:id:miyahan:20191208055007p:plain" title="f:id:miyahan:20191208055007p:plain" class="hatena-fotolife" itemprop="image"></span></figure></p> <p>さていくつかの<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C8%BD%CE%E3">判例</a>を見てきましたが、総合すると <strong>"仕事" のスコープ内でのみ検査が許されている</strong>ことがわかります。業務用PCや社用メールアドレスは仕事で使うものですから当然 "仕事" のスコープに入ります。所持品検査も退勤時、すなわち "仕事" → "私生活" の境界点で行われています。一方で<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B7%DD%CD%DB%A5%D0%A5%B9">芸陽バス</a>事件での自家用車内は "私生活" のスコープ内であり検査は原則強制できません。また日経クイック情報事件の判決文に <code>会社に持ち込まれた私物を保管させるために貸与されるロッカー等のスペースとは異なり…</code> との記述があったことを思い出してください。これは場合によっては私物用ロッカーが "私生活" のスコープに入るとみなすことができ、その場合は<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B6%AF%C0%A9%C1%DC%BA%BA">強制捜査</a>の権力が及ばない可能性を示しているのだと思います。</p> <p>これは至極当然なことで、例えば会社がオフィスに監視カメラを取り付けるのは問題ありませんが会社が「おまえの自宅に監視カメラを取り付けろ。さもないと懲戒処分するぞ」と脅してきたら当然違法に決まっています。</p> <p>それでは本件の個人PC等はどうでしょうか?業務に関わりがないのであれば私は個人所有のPCが "私生活" のスコープ内(<strong>完全に個人の領域</strong> )であると考えます。すなわち<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B7%DD%CD%DB%A5%D0%A5%B9">芸陽バス</a>事件と同様に、<strong>従業員が不正を行っている可能性を客観的に示すことがき、かつそれが所持品検査の合理的な理由となる場合限り個人PC等を強制検査することができる</strong>と考えます。例えば次のような場合が考えられるでしょう。</p> <ul> <li>職場内に私物のPCや<a class="keyword" href="http://d.hatena.ne.jp/keyword/USB%A5%E1%A5%E2%A5%EA">USBメモリ</a>を無断で持ち込んで、それを会社設備に接続されたことを検知した場合</li> <li>通信ログより社内ネットワークからインターネットを経由して従業員の自宅やオンラインサービス等にデータを送信している不審な通信を発見した場合</li> <li>従業員が私物の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%DE%A1%BC%A5%C8%A5%D5%A5%A9%A5%F3">スマートフォン</a>でオフィスや機密書類を無断で撮影していることを発見した場合</li> </ul> <p>一方で本施策のような<strong>「もしかしたら社員が会社情報を不正に持ち出しているかもしれない」という全く根拠のない憶測で検査を強制することは許されない</strong>というのが私の結論です。</p> <p>また会社が指定したソフトウェアを利用できなくする細工を強制する点についても、<strong>企業が個人の財産の機能(価値)を損なわせることは大きな問題</strong>だと考えます。「ソフトウェアの動作制限」というのは何となく穏当にも聞こえますが、「おまえが盗撮するかもしれないから私物の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%DE%A1%BC%A5%C8%A5%D5%A5%A9%A5%F3">スマートフォン</a>のカメラレンズを割って撮影できないようにしろ。そいつをよこせ!!」と言われたらどうでしょうか?とんでもない越権行為であり財産権の侵害です。そもそも業務時間外の<strong>人生の時間を何に使うかは個人の自由であり、会社が支配できるものではありません</strong>。</p> <blockquote><p>自宅PC点検を強制するな !問われているのは職場環境の改善<br/>  NTT東会社は、自宅のPCを点検し、会社に報告書を上げろ、それは「義務」だといい、<strong>職場によって未提出者には、「訓告処分」を出している</strong>。<br/>  そのやり方は、土足で個々人宅に上がりこみ、有無を言わせず「点検」し、抵抗すると「処分」するというやり方だ。プライバシーも何もあったものではない。こんなことは許されない。<br/> <cite><a href="http://ntt-workers.net/top/2010/2010top.html">NTT労働者 2010ニュース</a></cite></p></blockquote> <p>事態はすでに深刻化しているようで、<strong>拒否した社員の処分を行っている</strong>との情報もあります。極めて悪質と言わざるを得ません。</p> <h2><a class="keyword" href="http://d.hatena.ne.jp/keyword/NTT%A5%B0%A5%EB%A1%BC%A5%D7">NTTグループ</a>は<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B3%A5%F3%A5%D7%A5%E9%A5%A4%A5%A2%A5%F3%A5%B9">コンプライアンス</a>の遵守と抜本的問題解決を</h2> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fwww.tsr-net.co.jp%2Fnews%2Fanalysis%2F20170327_01.html" title="「上場企業の個人情報漏えい・紛失事故」調査" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;"></iframe><cite class="hatena-citation"><a href="https://www.tsr-net.co.jp/news/analysis/20170327_01.html">www.tsr-net.co.jp</a></cite></p> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/%C5%EC%B5%FE%BE%A6%B9%A9%A5%EA%A5%B5%A1%BC%A5%C1">東京商工リサーチ</a>によれば 2012〜2016年の5年間で<strong>最も情報漏えい事故を起こした上場企業は<a class="keyword" href="http://d.hatena.ne.jp/keyword/NTT%A5%B0%A5%EB%A1%BC%A5%D7">NTTグループ</a></strong>とのことで、その件数はなんと29件にも及びます。この醜態を鑑みれば手荒な対策を講じたくなるのもわからなくもないですが、それでもやって良いことと悪いことがあります。</p> <p>多くの方が指摘されているように、おそらくこの施策はいわゆる「セキュリティ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A4%B4%A4%C3%A4%B3">ごっこ</a>」・「やってますアピール」の一種だと想像します。<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%DE%A1%BC%A5%C8%A5%D5%A5%A9%A5%F3">スマートフォン</a>が広く普及している中、<a class="keyword" href="http://d.hatena.ne.jp/keyword/Windows">Windows</a>でしか動かないチェックツールを提供しそれ以外のOSやオンラインストレージは目視というやる気の無さがまさにそれです。このような意味がなく、従業員との信頼や士気だけをいたずらに損なうような表面的な対策で取り繕おうとする社風こそが<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%BB%A5%AD%A5%E5%A5%EA%A5%C6%A5%A3%A5%A4%A5%F3%A5%B7%A5%C7%A5%F3%A5%C8">セキュリティインシデント</a>を多発させているのではないでしょうか?</p> <p>さらに昨今ネットを賑わせているNTT退職エントリで<a class="keyword" href="http://d.hatena.ne.jp/keyword/NTT%A5%B0%A5%EB%A1%BC%A5%D7">NTTグループ</a>の劣悪なIT環境(低スペックなPC・インターネットの制限等)が紹介されています。そういった環境を回避しようとしてシャドーITが蔓延し情報漏洩につながってはいないでしょうか?<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C6%AF%A4%AD%CA%FD%B2%FE%B3%D7">働き方改革</a>と称し数字だけの残業時間削減を強行し、社員が業務データを自宅に持ち帰り<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B5%A1%BC%A5%D3%A5%B9%BB%C4%B6%C8">サービス残業</a>しなくてはいけないような状況は発生していないでしょうか?問題を分析し、根本原因を取り除くことに尽力すべきだと思います。</p> <p>あと取材記事で失望してしまった発言があります。</p> <blockquote><p>特定ソフトが入っているかどうかを確認しているだけで、PC内の個人情報をのぞいているわけではなく、プライバシーの侵害には当たらない</p></blockquote> <p>会社の機密情報や特定ソフトがあるかどうかを確認するには、PC内の全ファイルを走査する必要があります。もちろんそこには個人情報やセンシティブな情報も含まれておりプライバシーの問題は起こりうります。それをこのように問題ないと断言してしまうその認識の甘さや倫理観の欠如が、法の専門家や通信事業者が軒並み懸念を表明し反対する中、<a class="keyword" href="http://d.hatena.ne.jp/keyword/NTT%A5%B0%A5%EB%A1%BC%A5%D7">NTTグループ</a>が「悪いサイトを遮断してるだけだもん」と<a class="keyword" href="http://d.hatena.ne.jp/keyword/%CC%A1%B2%E8%C2%BC">漫画村</a><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D6%A5%ED%A5%C3%A5%AD%A5%F3%A5%B0">ブロッキング</a>を強行しようとしたことにも繋がっているのではないかと考えてしまいます。</p> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/NTT%A5%B0%A5%EB%A1%BC%A5%D7">NTTグループ</a>は良くも悪くも日本の通信を支える寡占企業です。そんな公共インフラを担う責任ある企業として、同社には<a class="keyword" href="http://d.hatena.ne.jp/keyword/%CB%A1%CE%E1%BD%E5%BC%E9">法令遵守</a>だけではなく高い倫理観が必要と思います。従業員を含めた<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%C6%A1%BC%A5%AF%A5%DB%A5%EB%A5%C0%A1%BC">ステークホルダー</a>の期待や信頼に応えること、また30万人を従える巨大企業として日本企業の手本となることを期待するとともに、本問題が一日でも早く是正されることを願います。</p> <p>ところで同様の施策が他の複数の企業でも行われているという声をしばしば耳にします。当然ですが「ほかもやってるから…」というのは理由には成りえません。悪習があるのであれば改めるべきです。同様に本来「必要悪」というものも存在しません。それはあるべき姿が何らかによって歪められてしまった結果の産物なのです。</p> miyahan Cisco Catalyst のTDR試験コマンドでポート故障を遠隔診断する hatenablog://entry/10257846132618311520 2018-09-01T14:21:49+09:00 2018-09-02T13:47:06+09:00 忙しい人向けサマリ リンク障害は現地での物理切り分けしかできずとてもつらい test cable-diagnostics tdr コマンドの結果が Fail もしくは Not completed になったら自装置のポート故障と判断できることを発見 判定率50%、誤検知率0%。範囲は狭いが信頼性が高く大変有用で障害対応時間が大幅短縮 こんにちは。とある通信会社の委託で壊れたルーターを取り替えるだけの簡単なお仕事をしている夜勤作業員です(エンジニアじゃないよ)。ふと思い出したので、私が新入社員のときに初め取り組んだ業務改善のお話をしたいと思います。 地味に面倒なリンク障害の切り分け %LINK-3… <h3>忙しい人向けサマリ</h3> <ul> <li>リンク障害は現地での物理切り分けしかできずとてもつらい</li> <li>test cable-diagnostics <a class="keyword" href="http://d.hatena.ne.jp/keyword/tdr">tdr</a> コマンドの結果が Fail もしくは Not completed になったら自装置のポート故障と判断できることを発見</li> <li>判定率50%、誤検知率0%。範囲は狭いが信頼性が高く大変有用で障害対応時間が大幅短縮</li> </ul> <hr /> <p>こんにちは。とある通信会社の委託で壊れた<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%EB%A1%BC%A5%BF%A1%BC">ルーター</a>を取り替えるだけの簡単なお仕事をしている夜勤作業員です(エンジニアじゃないよ)。ふと思い出したので、私が新入社員のときに初め取り組んだ業務改善のお話をしたいと思います。</p> <h3>地味に面倒なリンク障害の切り分け</h3> <blockquote><p>%LINK-3-CHANGED: Interface GigabitEthernet0/1 changed state to down %LINEPROTO-5-UPDOWN: Line protocol on Interface GigabitEthernet0/1, changed state to down</p></blockquote> <p>ネットワークを監視していると日常的に起きるリンク障害(リンクダウン・ポートダウン)。両装置がいまも稼働しているならば、その故障被疑箇所は主に装置Aのポート・装置Bのポート・それらをつなぐケーブルの3つが挙げられます。<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AA%A5%D7%A5%C6%A5%A3%A5%AB%A5%EB">オプティカル</a>なSFPであれば <code>show interfaces transceiver</code> などのコマンドで光を出してる・受けてるが遠隔で確認できますし、<a class="keyword" href="http://d.hatena.ne.jp/keyword/SONET/SDH">SONET/SDH</a>とかだったら <code>show controllers sonnet</code> とやればアラートや統計値が確認でき、ある程度の推測が可能です。しかしUTPを使ったナイーブな<a class="keyword" href="http://d.hatena.ne.jp/keyword/Ethernet">Ethernet</a> (<a class="keyword" href="http://d.hatena.ne.jp/keyword/1000BASE-T">1000BASE-T</a>等) ではこれといった有用な方法がありません。</p> <p>となると現地でケーブルを差し替えてみたり筐体を交換してみたりして物理的に切り分けるしかないのですが、両装置で保守部門が異なったりしていて最初にどちらかが対応してダメだったらバトンタッチするやら、故障箇所が分かってからベンダに代替品を手配するやらで、緊急対応なのに直るまで8時間と平気でかかかったりします。しかも <a class="keyword" href="http://d.hatena.ne.jp/keyword/1000BASE-T">1000BASE-T</a> などの細いリンクはネットワークの末端、すなわちエンドユーザーの入り口であることが多く、それは大抵シングル構成でリンクダウンがサービス中断に直結するため速やかに復旧させなくてはなりません。余談ですがこのような場所には <a class="keyword" href="http://d.hatena.ne.jp/keyword/Catalyst">Catalyst</a> 2960 や 3560 といったチープな機器が使われておりオンライン診断機能が貧弱・無い(POSTだけとか)のも痛いところです。</p> <h3>ケーブル試験コマンド?</h3> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20180901/20180901141146.png" alt="f:id:miyahan:20180901141146p:plain" title="f:id:miyahan:20180901141146p:plain" class="hatena-fotolife" itemprop="image"></span></p> <p>なんかいい方法ないかな〜といろいろ調べていた矢先、ふと <a href="https://www.cisco.com/c/ja_jp/td/docs/sw/lanswt-access/cat2960swt/cr/006/comref-book/cli2.html#pgfId-14631461"><code>test cable-diagnostics tdr</code></a> というコマンドを見つけました。<a class="keyword" href="http://d.hatena.ne.jp/keyword/TDR">TDR</a> (Time Domain Reflectometry) とは試験用のパルス信号を送り、反射して帰ってきた信号とその時間を分析することで伝送路の特性を測る手法です。ネットワークの世界ではどちらかというと<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B8%F7%A5%D5%A5%A1%A5%A4%A5%D0">光ファイバ</a>の減衰率を測定するOTDR (Optical <a class="keyword" href="http://d.hatena.ne.jp/keyword/TDR">TDR</a>) のほうが有名だと思います。よく「パルス試験器」と呼んでいました。<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%EC%A5%A4%A5%EA%A1%BC%BB%B6%CD%F0">レイリー散乱</a>とか<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D5%A5%EC%A5%CD%A5%EB%C8%BF%BC%CD">フレネル反射</a>とか懐かしい人いませんか?</p> <p>さて、では実際に使ってみましょう。まず対象ですが <a class="keyword" href="http://d.hatena.ne.jp/keyword/Cisco">Cisco</a> の最も安価なスイッチである <a class="keyword" href="http://d.hatena.ne.jp/keyword/Catalyst">Catalyst</a> 2960 シリーズの <a class="keyword" href="http://d.hatena.ne.jp/keyword/IOS">IOS</a> 12.2 系でも動くので大抵の<a class="keyword" href="http://d.hatena.ne.jp/keyword/Cisco">Cisco</a>スイッチなら対応していると思います(ただし <a class="keyword" href="http://d.hatena.ne.jp/keyword/100BASE-TX">100BASE-TX</a> ポートを持つ一部機種(旧機種?)は非対応だったようなおぼろげな記憶があります)。次に実行方法ですが、 <code>test cable-diagnostics tdr interface &lt;インターフェース名&gt;</code> というコマンドを実行してください。コマンドは何事も無く終了するので、試験が終わるまで5秒ほど待ってから結果を <code>show cable-diagnostics tdr interface &lt;インターフェース名&gt;</code> コマンドで確認します。なお<strong>試験時はリンクダウンし通信が途切れる</strong>でご注意ください。</p> <pre class="code" data-lang="" data-unlink>#test cable-diagnostics tdr interface GigabitEthernet0/24 #show cable-diagnostics tdr interface GigabitEthernet0/24 Interface Speed Local pair Pair length Remote pair Pair status --------- ----- ---------- ------------------ ----------- -------------------- Gi0/24 1000M Pair A 2 +/- 4 meters N/A Normal Pair C 2 +/- 4 meters N/A Normal Pair C 2 +/- 4 meters N/A Normal Pair D 2 +/- 4 meters N/A Normal</pre> <p>とこのようにUTP各ペアのケーブル長・ペアの組み合わせ(ストレート/クロス)・状態が確認できます。つまり名前の通りケーブルの状態を診断するコマンドなのですが、壊れた <a class="keyword" href="http://d.hatena.ne.jp/keyword/Catalyst">Catalyst</a> 2960 でこのコマンドを実行してみたところ、おもしろい結果が出てきました。</p> <pre class="code" data-lang="" data-unlink>#show cable-diagnostics tdr interface G0/24 Interface Speed Local pair Pair length Remote pair Pair status --------- ----- ---------- ------------------ ----------- -------------------- Gi0/24 1000M Pair A N/A N/A Fail Pair B N/A N/A Fail Pair C N/A N/A Fail Pair D N/A N/A Fail</pre> <p>Fail とでています。これは<a class="keyword" href="http://d.hatena.ne.jp/keyword/Cisco">Cisco</a>のコマンドリファレンスにも載っていない結果です。これは使えそうと直感し統計を取ってみることにしました。</p> <h3>データを取ったら傾向性が見えてきた</h3> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20180901/20180901113923.png" alt="f:id:miyahan:20180901113923p:plain" title="f:id:miyahan:20180901113923p:plain" class="hatena-fotolife" itemprop="image"></span></p> <p>本施策ではポート集約に使っている約1万台の <a class="keyword" href="http://d.hatena.ne.jp/keyword/Catalyst">Catalyst</a> 2960 / 3560 と対向の光アクセス装置間における約200件のリンクダウン障害(リンクダウン起きすぎィ!!)に対しケーブル試験コマンドを実行しデータを取ってみました。特に Fail と Normal が目立ちますね。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20180901/20180901115526.png" alt="f:id:miyahan:20180901115526p:plain" title="f:id:miyahan:20180901115526p:plain" class="hatena-fotolife" itemprop="image"></span></p> <p>またペアステータスと原因箇所の関係を見てみると、ステータスごとに原因の割合が大きく異なっています。これは有意っぽい。</p> <h4>Fail と Not completed は無条件で自装置故障と判断</h4> <pre class="code" data-lang="" data-unlink>Interface Speed Local pair Pair length Remote pair Pair status --------- ----- ---------- ------------------ ----------- -------------------- Gi0/24 1000M Pair A 9 +/- 4 meters N/A Fail Pair B 65535 +/- 4 meters N/A Normal Pair C 30 +/- 4 meters N/A Fail Pair D 6 +/- 4 meters N/A Fail</pre> <p>まず <strong>Fail になった案件は109件中109件(100%)が自装置のポート不良</strong>でした。<a class="keyword" href="http://d.hatena.ne.jp/keyword/Cisco">Cisco</a> に問い合わせてみたのですが「わからん。てかケーブルを診断するコマンドなのでそれ以外の意味はないよ」という塩回答しか返ってこなかったので断言はできませんが、おそらく試験を行う低レイヤーのパーツ(PHYチップ?)が故障しており試験そのものが正常に行えなかったことを示すものだと思います。件数的にも意味的にもこれは即自装置の故障と断定してよいでしょう。</p> <p>また <strong>Not completed も4件中4件(100%)が自装置のポート不良</strong>でした。これはいつまで経ってもケーブル試験が終わらないパターンで、試験機能が正常に動作しないことから件数は少ないものの意味的に考えて自装置の故障と断定してよいでしょう。</p> <h4>Open / Short は長さを使って判断できるかも?</h4> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20180901/20180901121741.png" alt="f:id:miyahan:20180901121741p:plain" title="f:id:miyahan:20180901121741p:plain" class="hatena-fotolife" itemprop="image"></span></p> <pre class="code" data-lang="" data-unlink>Interface Speed Local pair Pair length Remote pair Pair status --------- ----- ---------- ------------------ ----------- -------------------- Gi0/24 1000M Pair A 0 +/- 2 meters N/A Open Pair B 0 +/- 2 meters N/A Open Pair C 0 +/- 2 meters N/A Open Pair D 0 +/- 2 meters N/A Open</pre> <pre class="code" data-lang="" data-unlink>Interface Speed Local pair Pair length Remote pair Pair status --------- ----- ---------- ------------------ ----------- -------------------- Gi0/24 1000M Pair A 2 +/- 4 meters N/A Normal Pair B 0 +/- 4 meters N/A Short Pair C 2 +/- 4 meters N/A Normal Pair D 2 +/- 4 meters N/A Normal</pre> <p>次に Open と Short ですが、Pair Length に着目してみると <strong>0m 地点(つまり自身のポート)で断線・短絡が起きている場合は自装置が故障していることが多い</strong>ことが分かりました。件数が少なくデータが不十分なのと、1件ですが0mなのに対向装置を交換したら治ったという事例もあり(対応者の勘違いの可能性もアリ)断定はできないと思います。</p> <h4>Normal / ImpedanceMis はそっ閉じ</h4> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20180901/20180901123247.png" alt="f:id:miyahan:20180901123247p:plain" title="f:id:miyahan:20180901123247p:plain" class="hatena-fotolife" itemprop="image"></span></p> <p>最後に Normal と ImpedanceMis ですが、こちらも Pair Length が 0m や 規格外(65536メートルとか)だったりする場合は自装置の故障が多く、正常に値を測定できる場合は対向装置の故障が多いという傾向はありますが天気予報レベルの精度です。これで判断はできないと思います。</p> <h4>結論: 50%は遠隔切り分けできる!</h4> <p>というわけで安全側に倒して、Fail または Not completed になった場合は自装置のポート不良と判断するのがひとまずよさそうです。このとき特定率は50%、誤検知率は0%です。なかなかいい成績ではないでしょうか。もし両装置がどちらも<a class="keyword" href="http://d.hatena.ne.jp/keyword/Catalyst">Catalyst</a>ならば7割くらいは判定できるかもしれません。</p> <h4>おまけ: ハードウェア<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A2%A1%BC%A5%AD%A5%C6%A5%AF%A5%C1%A5%E3">アーキテクチャ</a>から推測できる故障</h4> <pre class="code" data-lang="" data-unlink>Interface Speed Local pair Pair length Remote pair Pair status --------- ----- ---------- ------------------ ----------- -------------------- Gi0/5 1000M Pair A N/A N/A N/A Pair B N/A N/A N/A Pair C N/A N/A N/A Pair D N/A N/A N/A Interface Speed Local pair Pair length Remote pair Pair status --------- ----- ---------- ------------------ ----------- -------------------- Gi0/6 1000M Pair A N/A N/A N/A Pair B N/A N/A N/A Pair C N/A N/A N/A Pair D N/A N/A N/A Interface Speed Local pair Pair length Remote pair Pair status --------- ----- ---------- ------------------ ----------- -------------------- Gi0/7 1000M Pair A N/A N/A N/A Pair B N/A N/A N/A Pair C N/A N/A N/A Pair D N/A N/A N/A Interface Speed Local pair Pair length Remote pair Pair status --------- ----- ---------- ------------------ ----------- -------------------- Gi0/8 1000M Pair A N/A N/A N/A Pair B N/A N/A N/A Pair C N/A N/A N/A Pair D N/A N/A N/A</pre> <p>余談ですがこのように複数のポートがまとめてダウンすることがあります。</p> <pre class="code" data-lang="" data-unlink>#show platform pm if-numbers interface gid gpn lpn port slot unit slun port-type lpn-idb gpn-idb ---------------------------------------------------------------------- Gi0/1 1 1 1 6/3 1 1 1 local Yes Yes Gi0/2 2 2 2 6/0 1 2 2 local Yes Yes Gi0/3 3 3 3 6/1 1 3 3 local Yes Yes Gi0/4 4 4 4 6/2 1 4 4 local Yes Yes Gi0/5 5 5 5 5/2 1 5 5 local Yes Yes Gi0/6 6 6 6 5/3 1 6 6 local Yes Yes Gi0/7 7 7 7 5/0 1 7 7 local Yes Yes Gi0/8 8 8 8 5/1 1 8 8 local Yes Yes Gi0/9 9 9 9 8/3 1 9 9 local Yes Yes Gi0/10 10 10 10 8/0 1 10 10 local Yes Yes</pre> <p>実はこのスイッチでは5〜8番ポートが同一の Port ASIC (ASIC#5) に接続されています。このようにハードウェアの構成を思い浮かべて「ああ、あのパーツが壊れたんだな」と故障モードと実際の事象を紐付けて被疑箇所を推測するのも大変有用です。</p> <h3>ポートダウン自動判定ツールの開発</h3> <p>前途の通りこの試験コマンドは通信断を伴うため、オペレーターが誤ったポートを指定したり正常なのに試験をしてしまったりしてアウテージが起きないようツールによる自動実行・自動判定の仕組みを作りました。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20180901/20180901132744.png" alt="f:id:miyahan:20180901132744p:plain" title="f:id:miyahan:20180901132744p:plain" class="hatena-fotolife" itemprop="image"></span></p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20180901/20180901132818.png" alt="f:id:miyahan:20180901132818p:plain" title="f:id:miyahan:20180901132818p:plain" class="hatena-fotolife" itemprop="image"></span></p> <p>こんな感じでWeb上からポート試験が実行できます。このとき使用中のポート(<a class="keyword" href="http://d.hatena.ne.jp/keyword/MAC%A5%A2%A5%C9%A5%EC%A5%B9">MACアドレス</a>エントリの有無で判断)を選択すると実行を拒否します。ツールはケーブル試験のほかに、shutdown/no shutdown や、speed と duplex の変更等のショックを与えてリセット回復も狙っています。そしてしばらくするとレポートが表示され、何をすべきかをオペレーターにレコメンドします。</p> <p>ちなみに speed や duplex を固定してみたり自動にしてみたりというショック療法は TAC から提案を受けてやってみたのですが、まったく効果がなくのちに廃止しています。</p> <p>はじめたばかりの <a class="keyword" href="http://d.hatena.ne.jp/keyword/PHP">PHP</a> と <a class="keyword" href="http://d.hatena.ne.jp/keyword/MySQL">MySQL</a> でヒーヒー言いながら作っていました。いやはや懐かしい。</p> <h3>セピア色の業務改善</h3> <p>新卒入社後<a class="keyword" href="http://d.hatena.ne.jp/keyword/NOC">NOC</a>に初期配属され、そのときの課長は「いいんじゃない?やってみてごらん」と自由奔放で、主査(主任)は「それがお客様のためになるならやろう!」と本質を大切にする方だったためサポートをやアド<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%A4%A5%B9">バイス</a>を頂きながらトントン拍子でここまで形にすることができました。遠隔切り分けにより障害対応時間を1/3に短縮することができ、その年の優良事例として表彰もされました。最低評価以外の査定をいただいた最初で最後の年でもあります。</p> <p>そして上司が変わり、職場が変わり、それがこの会社ではかなり特殊で貴重なものだったということを知りました。そのような恵まれた環境に居たから自分は<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%BD%A5%EA%A5%C6%A5%A3%A5%A2">ソリティア</a>おじさんの道に進まずに済んだのです。ちなみにその職場は今では「え?マニュアルに書いてあるコマンド以外打たないでよ。怖いから」という組織になっており、それを思うとなんとも黄昏れてしまう中堅おじさんなのでした。</p> miyahan EC2 Auto Scaling にあわせて Zabbix でホストの自動登録・削除がしたいんですよ hatenablog://entry/10257846132603532875 2018-07-28T12:49:10+09:00 2019-10-02T17:28:15+09:00 こんにちは、通信会社で壊れたルーターを取り替えるだけの夜勤作業員、な、のですが、とある縁で今はサーバーの監視・運用代行業務(MSP)をさせてもらっています。 具体的には Zabbix を使ってクラウドにある顧客のサーバーを監視しているのですが、オートスケーリングを使っている案件ではスケールイン、すなわちインスタンスが terminate されると当然ながら通信が途絶えるので、Zabbix agent is unreachable やら unavailable by ICMP やらのポーリング系アラートじゃんじゃん鳴ってしまいます。これでは実務上も精神衛生的にもよろしくないので何とかしたいなあと… <p>こんにちは、通信会社で壊れた<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%EB%A1%BC%A5%BF%A1%BC">ルーター</a>を取り替えるだけの夜勤作業員、な、のですが、とある縁で今はサーバーの監視・運用代行業務(MSP)をさせてもらっています。</p> <p>具体的には Zabbix を使って<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AF%A5%E9%A5%A6%A5%C9">クラウド</a>にある顧客のサーバーを監視しているのですが、オートスケーリングを使っている案件ではスケールイン、すなわち<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%B9%A5%BF%A5%F3%A5%B9">インスタンス</a>が terminate されると当然ながら通信が途絶えるので、Zabbix agent is unreachable やら unavailable by ICMP やらのポーリング系アラートじゃんじゃん鳴ってしまいます。これでは実務上も精神衛生的にもよろしくないので何とかしたいなあと少し考えてみました。</p> <p>おそらく Auto Scaling のイベントを <a class="keyword" href="http://d.hatena.ne.jp/keyword/SNS">SNS</a> で飛ばして Lambda でよしなにやる的なのが "ベストプ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%E9%A5%AF">ラク</a>ティス" ってやつなのでしょうが、いかんせん<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AF%A5%E9%A5%A6%A5%C9">クラウド</a>を触り始めてまだ2ヶ月で勝手が分かってないので、とりあえず思いつく古典的手法を試してみます。</p> <p>忙しい方は最後にあるデモ動画だけ見ていっていただければ幸いです。</p> <h3>スケールアウト時の自動登録は Zabbix におまかせ</h3> <p>Zabbix には標準で<a href="https://www.zabbix.com/documentation/2.2/jp/manual/discovery/auto_registration">エージェント自動登録機能</a>がついています。さらに設定ファイルにホスト<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%E1%A5%BF%A5%C7%A1%BC%A5%BF">メタデータ</a>を書いておけば、案件やサーバー種別ごとに柔軟な処理が行えます。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20180722/20180722180036.png" alt="f:id:miyahan:20180722180036p:plain" title="f:id:miyahan:20180722180036p:plain" class="hatena-fotolife" itemprop="image"></span></p> <p>今回の検証では Auto Scaling グループ用に "MySiteAS" という文字列を<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%E1%A5%BF%A5%C7%A1%BC%A5%BF">メタデータ</a>としてマスターAMIに書いておき、Zabbixサーバー側でこれを検知するとホストの登録・ホストグループへの参加・各種テンプレートのリンクを自動で行う自動登録アクションを作りました。</p> <p>参考:</p> <p><iframe src="https://www.slideshare.net/slideshow/embed_code/key/yu8njQiBe6vZvf" width="427" height="356" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC; border-width:1px; margin-bottom:5px; max-width: 100%;" allowfullscreen> </iframe> <div style="margin-bottom:5px"> <strong> <a href="https://www.slideshare.net/qryuu/zabbix-var2" title="全自動Zabbix ver2" target="_blank">全自動Zabbix ver2</a> </strong> from <strong><a href="https://www.slideshare.net/qryuu" target="_blank">真乙 九龍</a></strong> </div><cite class="hatena-citation"><a href="https://www.slideshare.net/qryuu/zabbix-var2">www.slideshare.net</a></cite></p> <h3>スケールイン時の自動削除はいろいろたいへん</h3> <p>一方でホストが終了した際の処理は一筋縄ではいきません。監視システムはホストが応答しないのは何らかの障害が起きているのか、意図的にシャットダウンされたのか判断できないからです。しかし仮想サーバーであればそのマネージャーが<a class="keyword" href="http://d.hatena.ne.jp/keyword/VM">VM</a>の状態を知ってます。EC2 では <a class="keyword" href="http://d.hatena.ne.jp/keyword/AWS">AWS</a> <a class="keyword" href="http://d.hatena.ne.jp/keyword/CLI">CLI</a> や <a class="keyword" href="http://d.hatena.ne.jp/keyword/AWS">AWS</a> <a class="keyword" href="http://d.hatena.ne.jp/keyword/SDK">SDK</a> を使って<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%B9%A5%BF%A5%F3%A5%B9">インスタンス</a>の状態を取得できるので、Zabbix server 側でそれを利用できれば終了検知・ホスト削除ができそうです。</p> <p>いろいろ試行錯誤してたどり着いたワークフローが次の通り。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20180722/20180722172446.png" alt="f:id:miyahan:20180722172446p:plain" title="f:id:miyahan:20180722172446p:plain" class="hatena-fotolife" itemprop="image"></span></p> <ol> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%B9%A5%BF%A5%F3%A5%B9">インスタンス</a>IDを<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%E1%A5%BF%A5%C7%A1%BC%A5%BF">メタデータ</a>から取得し Zabbix <a class="keyword" href="http://d.hatena.ne.jp/keyword/API">API</a> でホストマクロに登録</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/AWS">AWS</a> <a class="keyword" href="http://d.hatena.ne.jp/keyword/SDK">SDK</a> を使って定期的に<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%B9%A5%BF%A5%F3%A5%B9">インスタンス</a>のステータスを確認</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%B9%A5%BF%A5%F3%A5%B9">インスタンス</a>が terminated になったら Zabbix <a class="keyword" href="http://d.hatena.ne.jp/keyword/API">API</a> を使って Zabbix からホストを削除</li> </ol> <h4><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%B9%A5%BF%A5%F3%A5%B9">インスタンス</a>IDの取得とホストマクロ登録</h4> <h5><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%B9%A5%BF%A5%F3%A5%B9">インスタンス</a>IDの取得方法</h5> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%B9%A5%BF%A5%F3%A5%B9">インスタンス</a>IDは各<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%B9%A5%BF%A5%F3%A5%B9">インスタンス</a>上で<a href="https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ec2-instance-metadata.html">インスタンスメタデータ</a>にアクセスすれば簡単に参照することができますし、アクセスによる課金もされません。Zabbix でそれを取得するにはこのように<a href="https://www.zabbix.com/documentation/2.2/jp/manual/config/notifications/action/operation/remote_command">リモートコマンド</a>で <a class="keyword" href="http://d.hatena.ne.jp/keyword/curl">curl</a> を実行するアイテムを作るのが簡単そうです。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20180728/20180728121853.png" alt="f:id:miyahan:20180728121853p:plain" title="f:id:miyahan:20180728121853p:plain" class="hatena-fotolife" itemprop="image"></span></p> <p>ちなみに <code>-s</code> オプションをつけて進捗表示が結果に含まれてしまうことを防ぎ、<code>-f</code> オプションでHTTPエラーが発生した際に何も出力せずエラー終了させるようにします。残念ながら Zabbix には終了コードを判定する機能はありませんが…。</p> <p>ちなみにリモートコマンドを利用するには Zabbix agent のコンフィグファイルで <code>EnableRemoteCommands=1</code> の設定を入れる必要があります。もし諸事情でコマンドの実行ができない場合は、<a class="keyword" href="http://d.hatena.ne.jp/keyword/AWS">AWS</a> <a class="keyword" href="http://d.hatena.ne.jp/keyword/CLI">CLI</a> や <a class="keyword" href="http://d.hatena.ne.jp/keyword/AWS">AWS</a> <a class="keyword" href="http://d.hatena.ne.jp/keyword/SDK">SDK</a> を使って、プライベート<a class="keyword" href="http://d.hatena.ne.jp/keyword/IP%A5%A2%A5%C9%A5%EC%A5%B9">IPアドレス</a>等から<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%B9%A5%BF%A5%F3%A5%B9">インスタンス</a>を特定して<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%B9%A5%BF%A5%F3%A5%B9">インスタンス</a>IDを取得する方法が考えられます。</p> <h5><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%B9%A5%BF%A5%F3%A5%B9">インスタンス</a>ID情報をどこに保持するか問題</h5> <p>さて、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%B9%A5%BF%A5%F3%A5%B9">インスタンス</a>IDのアイテムは取得できましたが大きな問題があります。アイテムのキーは他のアイテムの値を参照することができないため、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%B9%A5%BF%A5%F3%A5%B9">インスタンス</a>IDを取得して保持しているアイテムとそれを引数にして<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%B9%A5%BF%A5%F3%A5%B9">インスタンス</a>の状態を取得するアイテムを作ることができません。そこで代替案を2つ考えました。</p> <p>案1:<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%B9%A5%BF%A5%F3%A5%B9">インスタンス</a>ID取得のアイテムにトリガー(<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%B9%A5%BF%A5%F3%A5%B9">インスタンス</a>ID変更・一定期間データが取れない等)を作り、アクションで外部<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%AF%A5%EA%A5%D7%A5%C8">スクリプト</a>を実行させ、そこで<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%B9%A5%BF%A5%F3%A5%B9">インスタンス</a>状態のチェックからホストの削除まで一括して行う。つまりZabbixを<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%AF%A5%EA%A5%D7%A5%C8">スクリプト</a>を呼ぶだけのタスクスケジューラとして使う</p> <ul> <li>pros: 条件を満たしたときのみ外部<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%AF%A5%EA%A5%D7%A5%C8">スクリプト</a>を実行するので Zabbix server/proxy が高負荷になりにくい</li> <li>cons: 状態遷移時にしかチェックが走らないので処理が漏れる可能性がある。またZabbixからEC2ステータス等の情報や状況を確認できない</li> </ul> <p>案2:<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%B9%A5%BF%A5%F3%A5%B9">インスタンス</a>IDをユーザーマクロに登録し各アイテム・トリガーで利用する(=ユーザーマクロをグローバル定数として使う)</p> <ul> <li>pros: さまざまなオブジェクトから<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%B9%A5%BF%A5%F3%A5%B9">インスタンス</a>IDを参照できるようになるため柔軟性・拡張性に優れる(CloudWatch連携とかしやすそう)</li> <li>cons: 定期的に外部<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%AF%A5%EA%A5%D7%A5%C8">スクリプト</a>で<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%B9%A5%BF%A5%F3%A5%B9">インスタンス</a>の状態をチェックするので負荷が高め</li> </ul> <p>いろいろ考えた結果、今後の展望を踏まえ後者のホストマクロに<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%B9%A5%BF%A5%F3%A5%B9">インスタンス</a>IDを登録する方法にしました。</p> <p>参考:</p> <p><iframe src="https://www.slideshare.net/slideshow/embed_code/key/4GxNkB9ICtTbN6" width="427" height="356" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC; border-width:1px; margin-bottom:5px; max-width: 100%;" allowfullscreen> </iframe> <div style="margin-bottom:5px"> <strong> <a href="https://www.slideshare.net/MiuraKatsu/zabbix-aws" title="ザビ家の野望 〜 全自動ZABBIX AWS編 〜" target="_blank">ザビ家の野望 〜 全自動ZABBIX AWS編 〜</a> </strong> from <strong><a href="https://www.slideshare.net/MiuraKatsu" target="_blank">Katsuhiro Miura</a></strong> </div><cite class="hatena-citation"><a href="https://www.slideshare.net/MiuraKatsu/zabbix-aws">www.slideshare.net</a></cite></p> <h5><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%B9%A5%BF%A5%F3%A5%B9">インスタンス</a>IDをホストマクロへ登録</h5> <p>ではさっそく<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%B9%A5%BF%A5%F3%A5%B9">インスタンス</a>IDをホストマクロに登録しましょう。Zabbix server/web ではそのような処理ができないため、外部<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%AF%A5%EA%A5%D7%A5%C8">スクリプト</a>で Zabbix <a class="keyword" href="http://d.hatena.ne.jp/keyword/API">API</a> を使って設定を行います。(Zabbix server が自分を設定する<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%AF%A5%EA%A5%D7%A5%C8">スクリプト</a>を実行するってのも変な話ですねw)</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20180728/20180728111905.png" alt="f:id:miyahan:20180728111905p:plain" title="f:id:miyahan:20180728111905p:plain" class="hatena-fotolife" itemprop="image"></span></p> <p>先程作った<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%B9%A5%BF%A5%F3%A5%B9">インスタンス</a>IDアイテムの値が変化したら発火するトリガーを作り、それを実行条件としたアクションを作ります。ここでミソなのがトリガーが "正常" になったときにアクションを実行させることです。初めて<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%B9%A5%BF%A5%F3%A5%B9">インスタンス</a>が立ち上がり Zabbix agent がデータを取り始めると、このトリガーは 不明 → 正常 に状態遷移します。そのためアクション条件を "障害" ではなく "正常" にすることで、値が変わった もしくは 初めて取得できた(トリガーの条件式が評価できた) ときに実行されるようになります。ちなみに厳密に言うとこれだと値が変わった際にアクションの実行が遅れてしまいますがリアルタイム性は必要ないのでよしとしています。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20180728/20180728111912.png" alt="f:id:miyahan:20180728111912p:plain" title="f:id:miyahan:20180728111912p:plain" class="hatena-fotolife" itemprop="image"></span></p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20180728/20180728111921.png" alt="f:id:miyahan:20180728111921p:plain" title="f:id:miyahan:20180728111921p:plain" class="hatena-fotolife" itemprop="image"></span></p> <p>そしてアクション実行内容としてリモートコマンドを実行させます。コマンドの引数として ホスト名 と アイテムの値(=<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%B9%A5%BF%A5%F3%A5%B9">インスタンス</a>ID) を渡しています。ここで「ホストIDを渡した方が確実なのでは…?」と思われるでしょうが、Zabbix はなぜかリモートコマンドの引数において HOST.ID を参照することができません。。。</p> <pre class="code lang-python" data-lang="python" data-unlink><span class="synComment">#!/bin/env python</span> <span class="synPreProc">import</span> argparse <span class="synPreProc">import</span> sys <span class="synPreProc">from</span> zabbix.api <span class="synPreProc">import</span> ZabbixAPI ZABBIX_SERVER = <span class="synConstant">'http://localhost/zabbix'</span> ZABBIX_USER = <span class="synConstant">'username'</span> ZABBIX_PASSWORD = <span class="synConstant">'password'</span> <span class="synStatement">if</span> __name__ == <span class="synConstant">'__main__'</span>: parser = argparse.ArgumentParser(description=<span class="synConstant">'Register instance-id to Zabbix host-macro'</span>) parser.add_argument(<span class="synConstant">'-n'</span>, <span class="synConstant">'--hostname'</span>, required=<span class="synIdentifier">True</span>, <span class="synIdentifier">help</span>=<span class="synConstant">'Zabbix hostname'</span>) parser.add_argument(<span class="synConstant">'-i'</span>, <span class="synConstant">'--instanceid'</span>, required=<span class="synIdentifier">True</span>, <span class="synIdentifier">help</span>=<span class="synConstant">'EC2 instance-id'</span>) args = parser.parse_args() <span class="synStatement">if</span> <span class="synStatement">not</span> args.hostname: sys.exit(<span class="synConstant">'ERROR: hostname is empty'</span>) <span class="synStatement">if</span> <span class="synStatement">not</span> args.instanceid: sys.exit(<span class="synConstant">'ERROR: instanceid is empty'</span>) <span class="synStatement">if</span> args.instanceid == <span class="synConstant">'unknown'</span>: sys.exit(<span class="synConstant">'unknown'</span>) <span class="synStatement">if</span> args.instanceid[<span class="synConstant">0</span>:<span class="synConstant">2</span>] != <span class="synConstant">'i-'</span>: sys.exit(<span class="synConstant">'ERROR: invalid instanceid'</span>) zapi = ZabbixAPI(url=ZABBIX_SERVER, user=ZABBIX_USER, password=ZABBIX_PASSWORD) <span class="synConstant">&quot;&quot;&quot;Get hostid by hostname&quot;&quot;&quot;</span> result = zapi.do_request( <span class="synConstant">'host.get'</span>, { <span class="synConstant">'filter'</span>: { <span class="synConstant">'host'</span>: [args.hostname] }, <span class="synConstant">'output'</span>: [<span class="synConstant">'name'</span>, <span class="synConstant">'hostid'</span>] } ) <span class="synStatement">if</span> <span class="synStatement">not</span> result[<span class="synConstant">'result'</span>]: sys.exit(<span class="synConstant">'host not found'</span>) <span class="synConstant">&quot;&quot;&quot;Update host macro&quot;&quot;&quot;</span> hostid = result[<span class="synConstant">'result'</span>][<span class="synConstant">0</span>][<span class="synConstant">'hostid'</span>] result = zapi.do_request( <span class="synConstant">'host.update'</span>, { <span class="synConstant">'hostid'</span>: hostid, <span class="synConstant">'macros'</span>: [ { <span class="synConstant">'macro'</span>: <span class="synConstant">'{$EC2_INSTANCEID}'</span>, <span class="synConstant">'value'</span>: args.instanceid, } ] } ) <span class="synIdentifier">print</span>(result[<span class="synConstant">'result'</span>]) </pre> <p>そしてこちらが実行される外部<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%AF%A5%EA%A5%D7%A5%C8">スクリプト</a>です。まず <code>host.get</code> <a class="keyword" href="http://d.hatena.ne.jp/keyword/API">API</a>を使い先程渡されたホスト名からホストIDを検索します。実に滑稽です。。。そしてそのホストIDに対し<code>host.update</code> <a class="keyword" href="http://d.hatena.ne.jp/keyword/API">API</a>を使ってマクロを追加・変更します。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20180728/20180728120628.png" alt="f:id:miyahan:20180728120628p:plain" title="f:id:miyahan:20180728120628p:plain" class="hatena-fotolife" itemprop="image"></span></p> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%B9%A5%BF%A5%F3%A5%B9">インスタンス</a>を起動してから数分経つと自動でホストマクロが登録されました。成功です。</p> <p>余談ですが Zabbix ではアクションで実行したリモートコマンドの標準出力・エラー出力・終了コードを参照できません。そのため外部<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%AF%A5%EA%A5%D7%A5%C8">スクリプト</a>が正常に動いているか確認するには、リダイレクト等でファイルに出力しそれを Zabbix server でログ監視するなどの対処が必要です。</p> <h4><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%B9%A5%BF%A5%F3%A5%B9">インスタンス</a>ステータスの取得</h4> <p>つづいて<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%B9%A5%BF%A5%F3%A5%B9">インスタンス</a>のステータスを監視していきます。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20180728/20180728121928.png" alt="f:id:miyahan:20180728121928p:plain" title="f:id:miyahan:20180728121928p:plain" class="hatena-fotolife" itemprop="image"></span></p> <p>リモートコマンドで <a class="keyword" href="http://d.hatena.ne.jp/keyword/AWS">AWS</a> <a class="keyword" href="http://d.hatena.ne.jp/keyword/SDK">SDK</a> を叩いてEC2<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%B9%A5%BF%A5%F3%A5%B9">インスタンス</a>の情報を取得するアイテムをホストに登録します。このとき必要なパラメータは、EC2のリージョン・IAMユーザーのアクセスキー・シークレットキー・監視する<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%B9%A5%BF%A5%F3%A5%B9">インスタンス</a>IDです。キー周りはテンプレートマクロとして予め定義しておき、それをホストに割り当てて継承させるのがよいでしょう。</p> <pre class="code lang-python" data-lang="python" data-unlink><span class="synComment">#!/bin/env python</span> <span class="synPreProc">import</span> argparse <span class="synPreProc">import</span> sys <span class="synPreProc">import</span> boto3 <span class="synStatement">if</span> __name__ == <span class="synConstant">'__main__'</span>: parser = argparse.ArgumentParser(description=<span class="synConstant">'Get EC2 instance status from AWS'</span>) parser.add_argument(<span class="synConstant">'-r'</span>, <span class="synConstant">'--region'</span>, required=<span class="synIdentifier">True</span>, <span class="synIdentifier">help</span>=<span class="synConstant">'AWS region name'</span>) parser.add_argument(<span class="synConstant">'-a'</span>, <span class="synConstant">'--accesskey'</span>, required=<span class="synIdentifier">True</span>, <span class="synIdentifier">help</span>=<span class="synConstant">'AWS access key'</span>) parser.add_argument(<span class="synConstant">'-s'</span>, <span class="synConstant">'--secretkey'</span>, required=<span class="synIdentifier">True</span>, <span class="synIdentifier">help</span>=<span class="synConstant">'AWS secret key'</span>) parser.add_argument(<span class="synConstant">'-i'</span>, <span class="synConstant">'--instanceid'</span>, required=<span class="synIdentifier">True</span>, <span class="synIdentifier">help</span>=<span class="synConstant">'EC2 instance-id'</span>) args = parser.parse_args() <span class="synStatement">if</span> <span class="synStatement">not</span> args.region: sys.exit(<span class="synConstant">'ERROR: region is empty'</span>) <span class="synStatement">if</span> <span class="synStatement">not</span> args.accesskey: sys.exit(<span class="synConstant">'ERROR: accesskey is empty'</span>) <span class="synStatement">if</span> <span class="synStatement">not</span> args.secretkey: sys.exit(<span class="synConstant">'ERROR: secretkey is empty'</span>) <span class="synStatement">if</span> <span class="synStatement">not</span> args.instanceid: sys.exit(<span class="synConstant">'ERROR: instanceid is empty'</span>) <span class="synStatement">if</span> args.instanceid == <span class="synConstant">'unknown'</span>: sys.exit(<span class="synConstant">'unknown'</span>) <span class="synStatement">if</span> args.instanceid[<span class="synConstant">0</span>:<span class="synConstant">2</span>] != <span class="synConstant">'i-'</span>: sys.exit(<span class="synConstant">'ERROR: invalid instanceid'</span>) ec2 = boto3.session.Session( aws_access_key_id=args.accesskey, aws_secret_access_key=args.secretkey).client(<span class="synConstant">'ec2'</span>, args.region) instances = ec2.describe_instances( InstanceIds=[args.instanceid] ) state = <span class="synIdentifier">None</span> <span class="synStatement">for</span> reservations <span class="synStatement">in</span> instances[<span class="synConstant">'Reservations'</span>]: <span class="synStatement">for</span> instance <span class="synStatement">in</span> reservations[<span class="synConstant">'Instances'</span>]: state = instance[<span class="synConstant">'State'</span>][<span class="synConstant">'Name'</span>] <span class="synStatement">if</span> <span class="synStatement">not</span> state: sys.exit(<span class="synConstant">'instance not found'</span>) <span class="synIdentifier">print</span>(state) </pre> <p>そしてこちらが呼ばれる<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%AF%A5%EA%A5%D7%A5%C8">スクリプト</a>。<a class="keyword" href="http://d.hatena.ne.jp/keyword/Amazon">Amazon</a>公式の<a class="keyword" href="http://d.hatena.ne.jp/keyword/Python">Python</a>用<a class="keyword" href="http://d.hatena.ne.jp/keyword/AWS">AWS</a> <a class="keyword" href="http://d.hatena.ne.jp/keyword/SDK">SDK</a> "<a href="https://aws.amazon.com/jp/sdk-for-python/">Boto 3</a>" を使ってEC2<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%B9%A5%BF%A5%F3%A5%B9">インスタンス</a>の情報を取りに行っています。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20180728/20180728122457.png" alt="f:id:miyahan:20180728122457p:plain" title="f:id:miyahan:20180728122457p:plain" class="hatena-fotolife" itemprop="image"></span></p> <p>しばらくしてアイテム値に<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%B9%A5%BF%A5%F3%A5%B9">インスタンス</a>のステータスが入ってきました。取れてますね。</p> <h4>ホストの自動削除</h4> <p>さてラストスパートです。取得した<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%B9%A5%BF%A5%F3%A5%B9">インスタンス</a>のステータスが "terminated" になったらホストを自動削除する仕組みを作ります。多分に漏れず、トリガーアクションではホストを削除するといった処理を行わせることはできないため、これもリモートコマンドで外部<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%AF%A5%EA%A5%D7%A5%C8">スクリプト</a>から Zabbix <a class="keyword" href="http://d.hatena.ne.jp/keyword/API">API</a> を叩いて実現させます。このできそうでできないのが Zabbix。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20180728/20180728122713.png" alt="f:id:miyahan:20180728122713p:plain" title="f:id:miyahan:20180728122713p:plain" class="hatena-fotolife" itemprop="image"></span></p> <p>アイテムの値が "terminated" になったら発火するトリガーを作り、それを条件にしたアクションを作成。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20180728/20180728122958.png" alt="f:id:miyahan:20180728122958p:plain" title="f:id:miyahan:20180728122958p:plain" class="hatena-fotolife" itemprop="image"></span></p> <p>そしてホスト削除用のリモートコマンドを実行します。渡す引数はホスト名のみ。</p> <pre class="code lang-python" data-lang="python" data-unlink><span class="synComment">#!/bin/env python</span> <span class="synPreProc">import</span> argparse <span class="synPreProc">import</span> sys <span class="synPreProc">from</span> zabbix.api <span class="synPreProc">import</span> ZabbixAPI ZABBIX_SERVER = <span class="synConstant">'http://localhost/zabbix'</span> ZABBIX_USER = <span class="synConstant">'username'</span> ZABBIX_PASSWORD = <span class="synConstant">'password'</span> <span class="synStatement">if</span> __name__ == <span class="synConstant">'__main__'</span>: parser = argparse.ArgumentParser(description=<span class="synConstant">'Delete host from Zabbix server'</span>) parser.add_argument(<span class="synConstant">'-n'</span>, <span class="synConstant">'--hostname'</span>, required=<span class="synIdentifier">True</span>, <span class="synIdentifier">help</span>=<span class="synConstant">'Zabbix hostname'</span>) args = parser.parse_args() zapi = ZabbixAPI(url=ZABBIX_SERVER, user=ZABBIX_USER, password=ZABBIX_PASSWORD) <span class="synConstant">&quot;&quot;&quot;Get hostid by hostname&quot;&quot;&quot;</span> result = zapi.do_request( <span class="synConstant">'host.get'</span>, { <span class="synConstant">'filter'</span>: {<span class="synConstant">'host'</span>: [args.hostname]}, <span class="synConstant">'output'</span>: [<span class="synConstant">'name'</span>, <span class="synConstant">'hostid'</span>] } ) <span class="synStatement">if</span> <span class="synStatement">not</span> result[<span class="synConstant">'result'</span>]: sys.exit(<span class="synConstant">'hostname not found'</span>) <span class="synConstant">&quot;&quot;&quot;Delete host from Zabbix server&quot;&quot;&quot;</span> hostid = result[<span class="synConstant">'result'</span>][<span class="synConstant">0</span>][<span class="synConstant">'hostid'</span>] result = zapi.do_request(<span class="synConstant">'host.delete'</span>, [hostid]) <span class="synIdentifier">print</span>(result) </pre> <p>で、これが<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%AF%A5%EA%A5%D7%A5%C8">スクリプト</a>。さきほどと同じくホスト名からホストIDをルックアップし、<code>host.delete</code> <a class="keyword" href="http://d.hatena.ne.jp/keyword/API">API</a>でホスト削除を行います。これで完成です!!</p> <h3>デモ動画</h3> <iframe width="560" height="315" frameborder="0" allowfullscreen="" src="//www.youtube.com/embed/vnbYhGUibW8"></iframe> <p><br><a href="https://youtube.com/watch?v=vnbYhGUibW8">Demo: Zabbix auto registration when EC2 scale-out</a></p> <p>まずスケールアウト(ホスト増加)から。まず Zabbix agent が起動したら Zabbix server にコンフィグを取りに行き、そのときにホスト<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%E1%A5%BF%A5%C7%A1%BC%A5%BF">メタデータ</a>を使ってサーバーにホストが自動登録され監視がスタートします。そして第2段階としてエージェント側でホスト<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%E1%A5%BF%A5%C7%A1%BC%A5%BF">メタデータ</a>から<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%B9%A5%BF%A5%F3%A5%B9">インスタンス</a>IDを取得しサーバーに送信します。サーバーはそれを受けリモートコマンドを実行しホストマクロに登録します。そして定期的に<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%B9%A5%BF%A5%F3%A5%B9">インスタンス</a>IDから<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%B9%A5%BF%A5%F3%A5%B9">インスタンス</a>のステータスを取りに行きます。</p> <iframe width="560" height="315" frameborder="0" allowfullscreen="" src="//www.youtube.com/embed/d0xuDDvTPCI"></iframe> <p><br><a href="https://youtube.com/watch?v=d0xuDDvTPCI">Demo: Zabbix auto host deleting when EC2 scale-in</a></p> <p>続いてスケールイン(ホスト減少)。定期的に取りに行っている<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%B9%A5%BF%A5%F3%A5%B9">インスタンス</a>ステータスが "terminated" になったらトリガーが発火しホストを削除するリモートコマンドが実行されます。サーチ&デストロイ。この早さであればポーリング系アラートは鳴りません。これで枕を高くして眠ることが出来ます。</p> <h3><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%BD%A1%BC%A5%B9%A5%B3%A1%BC%A5%C9">ソースコード</a></h3> <p>今回の検証で使った Zabbix テンプレート や 外部<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%AF%A5%EA%A5%D7%A5%C8">スクリプト</a>はこちらで公開しています。よろしければ使ってみて下さい。</p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fgithub.com%2Fmiyahan%2FZabbix_EC2_meta-data_check" title="miyahan/Zabbix_EC2_meta-data_check" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;"></iframe><cite class="hatena-citation"><a href="https://github.com/miyahan/Zabbix_EC2_meta-data_check">github.com</a></cite></p> <h3>おわりに</h3> <p>というわけでレガシーなシステムにレガシーな場当たり対処をしてモダンなサービスにどうにか対応したいと奮闘したお話でした。おそらくもう少しスマートな方法はあると思いますが、やはり Zabbix でイマドキなサービスを監視するのは限界なのかなーと思うところです。特にコンテナやサーバーレスなんかは Zabbix でどう監視するのか見当もつきません。まあ Zabbix を触ってまだ2ヶ月の初心者が言えることではありませんが…。</p> <p>ただ今回の試行錯誤を通して Zabbix は「痒いところに手が届かない。でもやりようはある」という絶妙な拡張性・柔軟性をもったプロダクトでもあることがわかりました。外部<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%AF%A5%EA%A5%D7%A5%C8">スクリプト</a>で全部やるとかそれは柔軟性なのか!?というツッコミはありますが、それは Zabbix <a class="keyword" href="http://d.hatena.ne.jp/keyword/API">API</a> が強力だからこそできる力技なんですから。</p> <p>これからも上手くつきあっていきたいと思います。</p> miyahan 職場でコーヒー会はじめました (デロンギ マグニフィカS導入) hatenablog://entry/8599973812326799173 2017-12-15T14:30:57+09:00 2020-04-07T13:33:26+09:00 職場にデロンギのフルオートエスプレッソマシン(コーヒーメーカー) マグニフィカを導入し、会費制の有志コーヒー会を立ち上げたお話。 <p>こんにちは、とある通信会社の委託でネットワークの監視・保守をやっている作業員です(エンジニアじゃないよ)。 今回は職場にコーヒーメーカーを買って飲みものを<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B6%A6%C6%B1%B9%D8%C6%FE">共同購入</a>する営みを始めた話をします。 夜勤を含む24時間体制で監視業務を行っている特殊な職場の事例ではありますが参考になれば幸いです。</p> <hr /> <p> 「缶コーヒー代って結構バカにならないよね−」<br /> それは同僚の何気ないひとことから始まりました。</p> <p>職場の休憩室に設置されている自販機は缶が110円・ペットボトルが140円で売られています。110円の缶コーヒーを1日1本飲むと月平均2,200円となかなかの金額になる上に、夜勤時の冷え込む時間には暖かい<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B8%A5%E7%A1%BC%A5%B8%A5%A2">ジョージア</a>や<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B9%C8%C3%E3%B2%D6%C5%C1">紅茶花伝</a>が飲みたくなるものですが夏場は「つめた〜い」飲みものしかないなどの不満がありました。そんなとき同僚の一言から「じゃあ自前で用意するか」と "コーヒー会" をスタートさせました。</p> <p>というわけで達成すべき目的は2つ:</p> <ol> <li><strong>缶コーヒーよりもリーズナブル</strong>にコーヒーを飲めるようにすること(同僚の主目的)</li> <li><strong>監視ルームですぐ淹れられる</strong>ようになること(私の主目的、詳しくは後述)</li> </ol> <h3>設備構築&会費検討</h3> <p>いきなりコーヒーメーカーを買うのは無理があるので、まずはスロースタートということでインスタントコーヒーから始めることに。とりあえず電気ポットや<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AB%A5%C3%A5%D7">カップ</a>スタンド、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AB%A5%C3%A5%D7">カップ</a>ホルダー、ディスペンサー、小物入れなどを自腹で買いそろえました。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20171215/20171215112839.jpg" alt="f:id:miyahan:20171215112839j:plain" title="f:id:miyahan:20171215112839j:plain" class="hatena-fotolife" itemprop="image"></span></p> <p><div class="hatena-asin-detail"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/B005J10VUE/miyahancom-22/"><img src="https://m.media-amazon.com/images/I/21hSRs97WbL._SL160_.jpg" class="hatena-asin-detail-image" alt="カップスタンド ホワイト クリアカップ ペーパーカップ保存用スタンド CSD-1" title="カップスタンド ホワイト クリアカップ ペーパーカップ保存用スタンド CSD-1"></a><div class="hatena-asin-detail-info"><p class="hatena-asin-detail-title"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/B005J10VUE/miyahancom-22/">カップスタンド ホワイト クリアカップ ペーパーカップ保存用スタンド CSD-1</a></p><ul><li><span class="hatena-asin-detail-label">メディア:</span> ホーム&amp;キッチン</li></ul></div><div class="hatena-asin-detail-foot"></div></div></p> <p><div class="hatena-asin-detail"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/B00GZBZBEI/miyahancom-22/"><img src="https://m.media-amazon.com/images/I/31y8tNZnfAL._SL160_.jpg" class="hatena-asin-detail-image" alt="クリンプ カップホルダー 7オンス~9オンス対応 5P ブラック DR-453" title="クリンプ カップホルダー 7オンス~9オンス対応 5P ブラック DR-453"></a><div class="hatena-asin-detail-info"><p class="hatena-asin-detail-title"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/B00GZBZBEI/miyahancom-22/">クリンプ カップホルダー 7オンス~9オンス対応 5P ブラック DR-453</a></p><ul><li><span class="hatena-asin-detail-label">メディア:</span> ホーム&amp;キッチン</li></ul></div><div class="hatena-asin-detail-foot"></div></div></p> <p><div class="hatena-asin-detail"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/B00FPG8JUC/miyahancom-22/"><img src="https://m.media-amazon.com/images/I/51l3J+oct0L._SL160_.jpg" class="hatena-asin-detail-image" alt="コーヒーメイト/インスタントコーヒーディスペンサー/アイデア雑貨 【1個】" title="コーヒーメイト/インスタントコーヒーディスペンサー/アイデア雑貨 【1個】"></a><div class="hatena-asin-detail-info"><p class="hatena-asin-detail-title"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/B00FPG8JUC/miyahancom-22/">コーヒーメイト/インスタントコーヒーディスペンサー/アイデア雑貨 【1個】</a></p><ul><li><span class="hatena-asin-detail-label">メディア:</span> ホーム&amp;キッチン</li></ul></div><div class="hatena-asin-detail-foot"></div></div></p> <p><div class="hatena-asin-detail"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/B001UJK0VY/miyahancom-22/"><img src="https://m.media-amazon.com/images/I/41GqSH8CdxL._SL160_.jpg" class="hatena-asin-detail-image" alt="山佳化成 ワンタッチシュガーポット" title="山佳化成 ワンタッチシュガーポット"></a><div class="hatena-asin-detail-info"><p class="hatena-asin-detail-title"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/B001UJK0VY/miyahancom-22/">山佳化成 ワンタッチシュガーポット</a></p><ul><li><span class="hatena-asin-detail-label">メディア:</span> ホーム&amp;キッチン</li></ul></div><div class="hatena-asin-detail-foot"></div></div></p> <p><div class="hatena-asin-detail"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/B00LP6AZC6/miyahancom-22/"><img src="https://m.media-amazon.com/images/I/51tNvr4uKvL._SL160_.jpg" class="hatena-asin-detail-image" alt="【まとめ買いセット】 木製 コーヒーマドラー14cm 400本セット (200本入× 2個組)" title="【まとめ買いセット】 木製 コーヒーマドラー14cm 400本セット (200本入× 2個組)"></a><div class="hatena-asin-detail-info"><p class="hatena-asin-detail-title"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/B00LP6AZC6/miyahancom-22/">【まとめ買いセット】 木製 コーヒーマドラー14cm 400本セット (200本入× 2個組)</a></p><ul><li><span class="hatena-asin-detail-label">メディア:</span> ホーム&amp;キッチン</li></ul></div><div class="hatena-asin-detail-foot"></div></div></p> <p>バスケット: <a href="https://www.nitori-net.jp/store/ProductDisplay?ptr=item&productId=313581&langId=-10&top_category=11010&parent_category_rn=11318&storeId=10001">&#x30CB;&#x30C8;&#x30EA;&#x30CD;&#x30C3;&#x30C8;&#x3010;&#x516C;&#x5F0F;&#x3011; &#x5BB6;&#x5177;&#x30FB;&#x30A4;&#x30F3;&#x30C6;&#x30EA;&#x30A2;&#x901A;&#x8CA9;</a></p> <p>さらに家でホコリを被っていた <a class="keyword" href="http://d.hatena.ne.jp/keyword/Nestle">Nestle</a> <a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%CD%A5%B9%A5%AB%A5%D5%A5%A7">ネスカフェ</a><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%EA%A5%B9%A5%BF">バリスタ</a> も引っこ抜いてきて休憩室の自担当冷蔵庫脇に設置。ちなみにワイヤーラックも購入。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20171215/20171215123640.jpg" alt="f:id:miyahan:20171215123640j:plain" title="f:id:miyahan:20171215123640j:plain" class="hatena-fotolife" itemprop="image"></span></p> <p>昼間は休憩室にある<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%CD%A5%B9%A5%AB%A5%D5%A5%A7">ネスカフェ</a><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%EA%A5%B9%A5%BF">バリスタ</a>を使ってもらい、夜勤時は上記のバスケットを監視ルーム(一応飲食禁止)に持ち込んで電気ポットですぐインスタントコーヒーが飲めるようにする目論見です。</p> <p>次に会費の検討です。試算したところ<strong>1杯15円</strong>の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%E9%A5%F3%A5%CB%A5%F3%A5%B0%A5%B3%A5%B9%A5%C8">ランニングコスト</a>がかかることがわかりました。</p> <table> <thead> <tr> <th style="text-align:left;"> 項目 </th> <th style="text-align:right;"> 単価 </th> <th style="text-align:left;"> 購入品 </th> </tr> </thead> <tbody> <tr> <td style="text-align:left;"> インスタントコーヒー </td> <td style="text-align:right;"> 6.4円 </td> <td style="text-align:left;"> AGF マキシム 135g 429円 ヨーカドーセール </td> </tr> <tr> <td style="text-align:left;"> ノンカロリー甘味料 </td> <td style="text-align:right;"> 2.6円 </td> <td style="text-align:left;"> シュガーカット顆粒ゼロ 1kg 2619円 </td> </tr> <tr> <td style="text-align:left;"> <a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AF%A5%EA%A1%BC%A5%DF%A1%BC">クリーミー</a>パウダー </td> <td style="text-align:right;"> 2.1円 </td> <td style="text-align:left;"> <a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%CD%A5%B9%A5%EC">ネスレ</a> ブライト 400g×2袋 549円 </td> </tr> <tr> <td style="text-align:left;"> 紙コップ 7oz </td> <td style="text-align:right;"> 3.0円 </td> <td style="text-align:left;"> 日本デキシー 紙コップ205ml 50個入 149円 </td> </tr> <tr> <td style="text-align:left;"> マドラー </td> <td style="text-align:right;"> 0.9円 </td> <td style="text-align:left;"> 木製コーヒーマドラー 200本入 184円 </td> </tr> <tr> <td style="text-align:left;"> <strong>合計</strong> </td> <td style="text-align:right;"> 15.0円 </td> <td style="text-align:left;"> - </td> </tr> </tbody> </table> <p>日勤時には1杯/日・夜勤時には2杯/泊で月15杯飲むのをモデルケースとし225円/人・月。この試算から<strong>会費を500円/月とし、出た利益から立て替えた初期投資分(1.5万円)をペイしていく</strong>ことにしました。</p> <h3>ピッチャー型電気ポット is 神</h3> <p>今年の6月、監視業務に従事している夜勤メンバーに声をかけたところ10人の希望者が集まりコーヒー会が運用がスタートしました。</p> <p>実際に運用してみると<strong>電気ポットが予想以上に便利</strong>で捗りました。休憩室は監視ルームからやや遠いうえに静脈認証ドアを通らないといけないため移動コストが高かったのですが、電気ポットを置いたことで思い立ったらすぐ熱々のコーヒーが飲めると大好評でした。</p> <p><div class="hatena-asin-detail"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/B000KHXB86/miyahancom-22/"><img src="https://m.media-amazon.com/images/I/416-ACOWLhL._SL160_.jpg" class="hatena-asin-detail-image" alt="象印 沸とう電気ポット 1.0L CH-DT10-XJ ステンレスブラウン" title="象印 沸とう電気ポット 1.0L CH-DT10-XJ ステンレスブラウン"></a><div class="hatena-asin-detail-info"><p class="hatena-asin-detail-title"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/B000KHXB86/miyahancom-22/">象印 沸とう電気ポット 1.0L CH-DT10-XJ ステンレスブラウン</a></p><ul><li><span class="hatena-asin-detail-label">発売日:</span> 2006/12/01</li><li><span class="hatena-asin-detail-label">メディア:</span> ホーム&amp;キッチン</li></ul></div><div class="hatena-asin-detail-foot"></div></div></p> <p>ちなみに一般的な電気ポットでもなく<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C5%C5%B5%A4%A5%B1%A5%C8%A5%EB">電気ケトル</a>でもなく、なぜピッチャーの形をした電気ポットを買ったというと、</p> <ul> <li>電気ポットを置くと他担当から「なにそんなの持ち込んでるの?」とクレームが入る恐れがあるが、ピッチャー形なら「お冷や入れです!!」とごまかせそう</li> <li>電気ポット・<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C5%C5%B5%A4%A5%B1%A5%C8%A5%EB">電気ケトル</a>は消費電力が1.5kWと高くブレーカーが飛ぶ恐れがあったが、この製品は沸くのは遅いが430Wと低いので安心</li> <li>一般的な<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C5%C5%B5%A4%A5%B1%A5%C8%A5%EB">電気ケトル</a>は沸かすだけだが、この製品は保温機能があるのでいつでもお湯が出る</li> </ul> <p>などの理由がありました。要するに電気ポットと<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C5%C5%B5%A4%A5%B1%A5%C8%A5%EB">電気ケトル</a>をいいとこどりな製品だったんです。実際その狙いは大いに当たりました。</p> <p><div class="hatena-asin-detail"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/B001QUF6ZM/miyahancom-22/"><img src="https://m.media-amazon.com/images/I/41kXQ2-gy7L._SL160_.jpg" class="hatena-asin-detail-image" alt="東芝ライテック 漏電保護タップ 住宅電気設備 LBY-120C" title="東芝ライテック 漏電保護タップ 住宅電気設備 LBY-120C"></a><div class="hatena-asin-detail-info"><p class="hatena-asin-detail-title"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/B001QUF6ZM/miyahancom-22/">東芝ライテック 漏電保護タップ 住宅電気設備 LBY-120C</a></p><ul><li><span class="hatena-asin-detail-label">メディア:</span> Tools &amp; Hardware</li></ul></div><div class="hatena-asin-detail-foot"></div></div></p> <p>なお、もしもの時の設備影響・感電を防止するために漏電保護タップを取り付けてあります。</p> <p>一方で想定が外れたのが<strong><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%CD%A5%B9%A5%AB%A5%D5%A5%A7">ネスカフェ</a><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%EA%A5%B9%A5%BF">バリスタ</a>が全く使われなかった</strong>こと。最初は物珍しさにしばしば使われていたのですが、1ヶ月もしないうちに全く稼働しなくなりいつのまにかインスタントコーヒーが湿気って固まっていました。まあ身も蓋もない言い方をすればただのインスタントコーヒー溶かし機なので、ふつうにポットでお湯を注いでかき混ぜたほうが早くて楽なんです。</p> <p>インスタントコーヒーディスペンサーを導入したことで瓶をあけてスプーンで規<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C4%EA%CE%CC">定量</a>を測る手間が無くなり、傾ければ1杯分の粉が出てくる便利さも<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%EA%A5%B9%A5%BF">バリスタ</a>離れに一役買ったような気がします。</p> <p>というわけで、なんとかアンバサダーを検討しているみなさん。あれただのプリンタインク商法でどんどん損してくので止めた方がいいですよ。</p> <h3>ライバル、本格ミル挽きコーヒー出現</h3> <p>お財布の負荷は減り、いつでも暖かいコーヒーが飲めると喜んでいた矢先、突如ライバルが出現します。休憩室に本格ミル挽きコーヒーの<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AB%A5%C3%A5%D7">カップ</a>自販機(<a href="http://www.mirubiki-coffee.jp/lineup/">トーヨーペンディング アドマイヤ</a>)が導入されたのです。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20171215/20171215124525.jpg" alt="f:id:miyahan:20171215124525j:plain" title="f:id:miyahan:20171215124525j:plain" class="hatena-fotolife" itemprop="image"></span><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20171215/20171215124530.jpg" alt="f:id:miyahan:20171215124530j:plain" title="f:id:miyahan:20171215124530j:plain" class="hatena-fotolife" itemprop="image"></span></p> <p>1杯180〜280円と強気の価格設定でしたが、実際飲んでみるととても美味い。くやしい…でも買っちゃう…!! この刺客により再び我々の財布は厳しくなっていきました。アンケートを取ったところ「会費を上げてもいいので、もっとおいしいのコーヒーを飲みたい」という意見が多かったため、初期の「コーヒー代をとにかく安く」というポリシーを「<strong>美味しいコーヒーを安く</strong>」に改め、我々も対抗して本格ミル挽きコーヒーに参入することにしました。</p> <p><div class="hatena-asin-detail"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/B01M0TY6KZ/miyahancom-22/"><img src="https://m.media-amazon.com/images/I/41-VdoLl06L._SL160_.jpg" class="hatena-asin-detail-image" alt="【スタンダードモデル】デロンギ (DeLonghi)  コンパクト全自動コーヒーメーカー  マグニフィカS  ブラック  ECAM23120BN" title="【スタンダードモデル】デロンギ (DeLonghi)  コンパクト全自動コーヒーメーカー  マグニフィカS  ブラック  ECAM23120BN"></a><div class="hatena-asin-detail-info"><p class="hatena-asin-detail-title"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/B01M0TY6KZ/miyahancom-22/">【スタンダードモデル】デロンギ (DeLonghi)  コンパクト全自動コーヒーメーカー  マグニフィカS  ブラック  ECAM23120BN</a></p><ul><li><span class="hatena-asin-detail-label">発売日:</span> 2016/10/01</li><li><span class="hatena-asin-detail-label">メディア:</span> ホーム&amp;キッチン</li></ul></div><div class="hatena-asin-detail-foot"></div></div></p> <p>コーヒーメーカーは <a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C7%A5%ED%A5%F3%A5%AE">デロンギ</a> マグニフィカ S ECAM23120BN を迷わず選定。というのもコーヒー殻を捨てる行程を含めたフルオートで現実的な価格という条件だと<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C7%A5%ED%A5%F3%A5%AE">デロンギ</a>くらいしか見つかりませんでした。またこのモデルはエントリーモデルに無い「カフェ・ジャポーネ」という蒸らし行程を入れドリップコーヒー風のテイストが味わえるモードが用意されているのがポイントでした。一方でさらに上位のモデルなら全自動でカフェラテや<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AB%A5%D7%A5%C1%A1%BC%A5%CE">カプチーノ</a>が作れるのですが、牛乳の管理など衛生上の課題が拭えないことから見送りました。スチームノズルが付いてるので、やる気があれば自分でミルクフォームが作れますしね。</p> <p>またアンケートで「コーヒーが飲めないので、緑茶や紅茶があるとうれしい」という意見を何人かからもらったので<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C6%A5%A3%A1%BC">ティー</a>バッグをラインナップに加えることにしました。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20171215/20171215132711.jpg" alt="f:id:miyahan:20171215132711j:plain" title="f:id:miyahan:20171215132711j:plain" class="hatena-fotolife" itemprop="image"></span></p> <p>ファミレスのドリンクバーを再現したく、無印商品で<a href="https://www.muji.net/store/list/%E5%AE%B6%E5%85%B7%E3%83%BB%E3%82%A4%E3%83%B3%E3%83%86%E3%83%AA%E3%82%A2%E3%83%BB%E5%AE%B6%E9%9B%BB%2B%E5%8F%8E%E7%B4%8D%2B%E5%B0%8F%E7%89%A9%E5%8F%8E%E7%B4%8D%E7%94%A8%E5%93%81%2B%E3%82%A2%E3%82%AF%E3%83%AA%E3%83%AB%E5%8F%8E%E7%B4%8D">アクリル製引き出し</a> を買ってきて、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C6%A5%A3%A1%BC">ティー</a>バッグの化粧箱を切り抜いてペタペタ。かなりそれっぽくなったんでしょうか?</p> <p>また紙コップが小さい・すぐ冷めてしまうという意見があったことから、大容量で断熱性に優れるフタつき紙コップに変更。</p> <p>これらの変更によりコストが<strong>63円/杯</strong>に跳ね上がり 948円/月・人に。このことから会費を1,000円/月に値上げ。会員数10名で毎月の利益が520円。今回追加投資した10万円の回収に約16年かかる計算です。その前に確実に異動すると思います。(多分に個人的趣味と野望が入っているので端から回収しようとは思っていません。黒字であればいいです)</p> <table> <thead> <tr> <th style="text-align:left;"> 項目 </th> <th style="text-align:right;"> 単価 </th> <th style="text-align:left;"> 購入品 </th> </tr> </thead> <tbody> <tr> <td style="text-align:left;"> コーヒー豆(15g) </td> <td style="text-align:right;"> 38.0円 </td> <td style="text-align:left;"> <a class="keyword" href="http://d.hatena.ne.jp/keyword/KALDI">KALDI</a> <a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%DA%A5%B7%A5%E3">スペシャ</a>ル<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D6%A5%EC%A5%F3%A5%C9">ブレンド</a> 200g 507円 </td> </tr> <tr> <td style="text-align:left;"> ノンカロリー甘味料 </td> <td style="text-align:right;"> 2.6円 </td> <td style="text-align:left;"> シュガーカット顆粒ゼロ 1kg 2619円 </td> </tr> <tr> <td style="text-align:left;"> <a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AF%A5%EA%A1%BC%A5%DF%A1%BC">クリーミー</a>パウダー </td> <td style="text-align:right;"> 2.1円 </td> <td style="text-align:left;"> <a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%CD%A5%B9%A5%EC">ネスレ</a> ブライト 400g×2袋 549円 </td> </tr> <tr> <td style="text-align:left;"> 紙コップ 14oz </td> <td style="text-align:right;"> 12.6円 </td> <td style="text-align:left;"> サンナップ 厚紙<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AB%A5%C3%A5%D7">カップ</a> 400ml 50個入 486円 </td> </tr> <tr> <td style="text-align:left;"> 紙コップ フタ </td> <td style="text-align:right;"> 7.0円 </td> <td style="text-align:left;"> サンナップ 厚紙<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AB%A5%C3%A5%D7">カップ</a>用フタ 100個入 224円 </td> </tr> <tr> <td style="text-align:left;"> マドラー </td> <td style="text-align:right;"> 0.9円 </td> <td style="text-align:left;"> 木製コーヒーマドラー 200本入 184円 </td> </tr> <tr> <td style="text-align:left;"> <strong>合計</strong> </td> <td style="text-align:right;"> 63.2円 </td> <td style="text-align:left;"> - </td> </tr> </tbody> </table> <h3>コーヒー会ここに完成</h3> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20171215/20171215134745.jpg" alt="f:id:miyahan:20171215134745j:plain" title="f:id:miyahan:20171215134745j:plain" class="hatena-fotolife" itemprop="image"></span></p> <p>コーヒー会発足から半年。ついに思い描いていた完成形に達することができました。挽き立てのコーヒー豆から淹れた<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A8%A5%B9">エス</a>プレッソは本当に美味しく、さらに追加投資してキャラメルソースやチョコレートソースと買って職場内カフェを作りたい欲望まで出てきました。</p> <p>緑茶や紅茶も少しグレードの高いものを選定したためかこれまた美味い。真夜中のひもじい時に飲む香ばしい玄米茶は身体に染みます。紅茶の華やかな香りもリラックスにとても最適。</p> <p>飲みもののクオリティがあがったことで、休憩のクオリティが上がり、ひいては業務のパフォーマンスや職場生活品質の向上が図れればと思います。</p> <h3>コーヒー会<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%DD%A1%BC%A5%BF%A5%EB%A5%B5%A5%A4%A5%C8">ポータルサイト</a></h3> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20171215/20171215141311.jpg" alt="f:id:miyahan:20171215141311j:plain" title="f:id:miyahan:20171215141311j:plain" class="hatena-fotolife" itemprop="image"></span></p> <p>最後に技術っぽい話を。</p> <p>会員からお金をもらって運営するという性質上、金や物の流れを透明化したいモチベーションから<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%DD%A1%BC%A5%BF%A5%EB%A5%B5%A5%A4%A5%C8">ポータルサイト</a>を作りました。ベタに <a class="keyword" href="http://d.hatena.ne.jp/keyword/Excel">Excel</a> で管理しても良かったのですが、会社外で閲覧・編集ができない(かといって社内では <a class="keyword" href="http://d.hatena.ne.jp/keyword/Dropbox">Dropbox</a> などのストレージや、Office 365 や <a class="keyword" href="http://d.hatena.ne.jp/keyword/Google%20%A5%B9%A5%D7%A5%EC%A5%C3%A5%C9%A5%B7%A1%BC%A5%C8">Google スプレッドシート</a> などのオンラインアプリは遮断されており利用できず)ので<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D5%A5%EC%A1%BC%A5%E0%A5%EF%A1%BC%A5%AF">フレームワーク</a>の勉強も兼ねてWebサイトにしました。</p> <p>私が借りている<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%EC%A5%F3%A5%BF%A5%EB%A5%B5%A1%BC%A5%D0">レンタルサーバ</a>ーでは <a class="keyword" href="http://d.hatena.ne.jp/keyword/Ruby">Ruby</a> や <a class="keyword" href="http://d.hatena.ne.jp/keyword/Python">Python</a> がまともに動かないので実質 <a class="keyword" href="http://d.hatena.ne.jp/keyword/PHP">PHP</a> 一択。<a class="keyword" href="http://d.hatena.ne.jp/keyword/CakePHP">CakePHP</a> あたりが有名ですが、<a class="keyword" href="http://d.hatena.ne.jp/keyword/Google">Google</a> トレンドを見ると Laravel が近年圧倒的人気なようだったので選定。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20171215/20171215142018.jpg" alt="f:id:miyahan:20171215142018j:plain" title="f:id:miyahan:20171215142018j:plain" class="hatena-fotolife" itemprop="image"></span> <span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20171215/20171215142022.jpg" alt="f:id:miyahan:20171215142022j:plain" title="f:id:miyahan:20171215142022j:plain" class="hatena-fotolife" itemprop="image"></span> <span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20171215/20171215142026.jpg" alt="f:id:miyahan:20171215142026j:plain" title="f:id:miyahan:20171215142026j:plain" class="hatena-fotolife" itemprop="image"></span> <span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20171215/20171215142029.jpg" alt="f:id:miyahan:20171215142029j:plain" title="f:id:miyahan:20171215142029j:plain" class="hatena-fotolife" itemprop="image"></span></p> <p>会員の管理や会費の納付状況、全体の財政状況、消耗品のストック状況などを管理・閲覧できるようにしています。</p> <p>図らずもユーザーの登録・認証、データベースから在庫情報を取ってきたり更新したりとWebアプリケーションの基本的エッセンスが多く含まれており学習課題としてかなり優秀なんじゃないでしょうかこれ。</p> <p>なおラインナップの紹介やコーヒー会の概要など部外者に見られてもよい情報は認証無し、内部情報を伴うページはユーザー認証有りとしました。ユーザー登録は部外者にされては困るので会社のメールアドレスのみを許容し、そのメールアドレスに書かれた認証ページを踏まないと登録が完了しないようにしました。まあ普通ですね。</p> <p>ちなみに今回使った Laravel ですが、バージョンが 0.1 違うだけでクラスの構成やメソッド名、<a class="keyword" href="http://d.hatena.ne.jp/keyword/CLI">CLI</a>コマンド等が大きく異なりリファレンスが役に立たないし、互換性も低い。さらに<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D5%A5%EB%A5%B9%A5%BF">フルスタ</a>ックWAFにしては機能が足りておらず、上記のメール認証も自前で書く必要がありました。<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D5%A5%EC%A1%BC%A5%E0%A5%EF%A1%BC%A5%AF">フレームワーク</a>とは何だったのか…。たしかに作りは今風ですが、発展途上でプロダクションで使うには時期尚早だなと感じました。そしてなにより動作がもっさり。おとなしく <a class="keyword" href="http://d.hatena.ne.jp/keyword/CakePHP">CakePHP</a> で作れば良かった…。</p> <hr /> <p>勉強会などでイケてるIT企業におじゃまするたび、休憩室にドリンクバーがあったり、社内カフェがあったり、バランスボールや畳があったりと憧れの的でしたが、それが自分の会社でも少しではありますが達成できたのです。</p> <p>プール金マイナス11万に少し青ざめたりもしたけれど、野望が叶って私は満足です。コーヒーおいしいです。^q^</p> <hr /> <h3>余談:お紅茶</h3> <p>これまで紅茶の種類なんて意識したことが無かったのですが、今回を機にちょっと<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C0%A1%BC%A5%B8%A5%EA%A5%F3">ダージリン</a>とアッサムを飲み比べてみました。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20171215/20171215212313.jpg" alt="f:id:miyahan:20171215212313j:plain" title="f:id:miyahan:20171215212313j:plain" class="hatena-fotolife" itemprop="image"></span></p> <p>左が<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C0%A1%BC%A5%B8%A5%EA%A5%F3">ダージリン</a>、右がアッサム。抽出のスピードから色まで全然違います。アッサムは全体的に味が濃く<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B9%F2%CA%AA">穀物</a>茶のようなテイスト。<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C0%A1%BC%A5%B8%A5%EA%A5%F3">ダージリン</a>は華やかな香りと透き通ってまっすぐな渋み・えぐみがあります。個人的には<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C0%A1%BC%A5%B8%A5%EA%A5%F3">ダージリン</a>の方が紅茶のイメージ通りな香りと味で好きです。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20171215/20171215212314.jpg" alt="f:id:miyahan:20171215212314j:plain" title="f:id:miyahan:20171215212314j:plain" class="hatena-fotolife" itemprop="image"></span></p> <p>しかしミルクを入れると方向性が全く変わります。<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C0%A1%BC%A5%B8%A5%EA%A5%F3">ダージリン</a>はミルクに負けてなんだかパっとしない味になりますが、一方でアッサムは香りや渋みが引き立ってミルクとよく馴染んでいます。ミルク<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C6%A5%A3%A1%BC">ティー</a>にするなら圧倒的にアッサムですね。</p> <p>こんな違うもんなんですねー。</p> <hr /> <h3>追記: まさかの完済</h3> <p>はじめてから1年半、ついに完全黒字化を達成!</p> <p><blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">職場コーヒー会、一時期14万円あった負債(ぼくが立て替えて買った全自動<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A8%A5%B9">エス</a>プレッソメーカー)をなんと完済し完全黒字化!<br><br>こうしてみると新機材導入から収益がアップしており設備投資って大事なんだなという学び。1年半の道のり。<br><br>職場でコーヒー会はじめました - miyalog <a href="https://t.co/oXtJD6Bit5">https://t.co/oXtJD6Bit5</a> <a href="https://t.co/EEn3NwiOZB">pic.twitter.com/EEn3NwiOZB</a></p>&mdash; Miyahan (@miyahancom) <a href="https://twitter.com/miyahancom/status/1030732954710859776?ref_src=twsrc%5Etfw">2018年8月18日</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> </p> <p>当初は回収できないと思っていましたが、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A8%A5%B9">エス</a>プレッソメーカー導入によりメンバーが一気に30人増え(コンビニでドリップコーヒー買ってた勢が大幅に<a class="keyword" href="http://d.hatena.ne.jp/keyword/%CE%AE%C6%FE">流入</a>)、さらにコーヒー通から安くて美味いコーヒー豆を教えてもらいコストダウンが図れたことが黒字幅増大につながりました。それにしても、見返すと図らずも スロースタート → 多額投資で品質アップ → <a class="keyword" href="http://d.hatena.ne.jp/keyword/%B8%DC%B5%D2%CB%FE%C2%AD%C5%D9">顧客満足度</a>向上 → 会員数・収益アップ というスタートアップのサクセスストーリーになってますね。興味深い。</p> <p>さてこれからは溜まったお金でかき氷器でも買いましょうかね。</p> miyahan Material for MkDocs を日本語対応した話&初めてのOSSコントリビュート hatenablog://entry/8599973812315174268 2017-11-07T00:53:22+09:00 2018-04-17T17:10:42+09:00 ドキュメントジェネレーター MkDocs のサードパーティーテーマ "Material" 向けにパッチを書いて日本語に対応した話。および Material for MkDocs での日本語表示・日本語検索の設定方法の解説。 <p>結論: MkDocs (0.17以上) + Material (2.0.3以上) テーマにおいて、次の設定を行うことで日本語UI表示+日本語検索(マルチバイト検索)が可能になります!</p> <pre class="code lang-yaml" data-lang="yaml" data-unlink><span class="synIdentifier">theme</span><span class="synSpecial">:</span> <span class="synIdentifier">name</span><span class="synSpecial">:</span> <span class="synConstant">'material'</span> <span class="synIdentifier">language</span><span class="synSpecial">:</span> <span class="synConstant">'ja'</span> <span class="synIdentifier">extra</span><span class="synSpecial">:</span> <span class="synIdentifier">search</span><span class="synSpecial">:</span> <span class="synIdentifier">language</span><span class="synSpecial">:</span> <span class="synConstant">'jp'</span> </pre> <hr /> <h2>MkDocs いいよ、MkDocs</h2> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fwww.mkdocs.org%2F" title="MkDocs" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;"></iframe><cite class="hatena-citation"><a href="https://www.mkdocs.org/">www.mkdocs.org</a></cite></p> <p>最近仕事で MkDocs というドキュメントジェネレーターを導入し始めています。マニュアルやドキュメントを作る際、オフライン(<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%BF%A5%F3%A5%C9%A5%A2%A5%ED%A5%F3">スタンドアロン</a>環境)で参照したり他部門に成果物を共有したりする場合があるため <a class="keyword" href="http://d.hatena.ne.jp/keyword/Wiki">Wiki</a> や <a class="keyword" href="http://d.hatena.ne.jp/keyword/CMS">CMS</a> はポータビリティの関係からできれば使いたくないし、かといってHTML手書きはさすがに辛い。また <a class="keyword" href="http://d.hatena.ne.jp/keyword/PowerPoint">PowerPoint</a> や Word で消耗したくもない。そんなとき思いついたのが静的ファイルを生成してくれるドキュメントジェネレーターでした。</p> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/Sphinx">Sphinx</a> や Re:VIEW などが有名ですがそこまでの表現力・柔軟性は要りませんし、何より他のシステムとの互換性から <a class="keyword" href="http://d.hatena.ne.jp/keyword/Markdown">Markdown</a> を使いたかったので一番よく耳にする MkDocs を採用しました。(<a class="keyword" href="http://d.hatena.ne.jp/keyword/Python">Python</a>製ってのも惹かれた)</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20171115/20171115000825.png" alt="f:id:miyahan:20171115000825p:plain" title="f:id:miyahan:20171115000825p:plain" class="hatena-fotolife" itemprop="image"></span></p> <p>一般的な <a class="keyword" href="http://d.hatena.ne.jp/keyword/Markdown">Markdown</a> ファイルにサイト構成(ページ一覧)を書いた<a class="keyword" href="http://d.hatena.ne.jp/keyword/YAML">YAML</a>ファイルを1つ作るだけで動き、吐き出されるHTMLもおシャレでわかりやすくかなり気に入ったのですが、唯一、<strong>日本語検索ができない</strong>という制約が引っかかりました。</p> <h2>Material for MkDocs 日本語対応</h2> <p><a href="https://qiita.com/mebiusbox2/items/a61d42878266af969e3c#-%E6%A4%9C%E7%B4%A2%E3%81%AE%E6%97%A5%E6%9C%AC%E8%AA%9E%E5%AF%BE%E5%BF%9C">MkDocsによるドキュメント作成 - Qiita</a> のように独自に改良されている事例もありましたが、ドキュメントをビルドするたびにファイルを差し替える必要があり面倒そうでした。そんなとき<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B5%A1%BC%A5%C9%A5%D1%A1%BC%A5%C6%A5%A3%A1%BC">サードパーティー</a>製のテーマである Material for MkDocs で言語を指定するとマルチ言語対応の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C1%B4%CA%B8%B8%A1%BA%F7">全文検索</a>ライブラリ <a href="https://github.com/MihaiValentin/lunr-language">lunr-languages</a> を自動でロードすることに気づきました。どうやら独自で多言語化対応を進めているようです。</p> <p>まだ日本語には対応しておらず日本語を指定するとエラーになって使えない状態でしたが、見よう見まねで言語定義ファイルを作ってみたところ日本語表示&日本語検索が動くようになりました!</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20171107/20171107004355.png" alt="f:id:miyahan:20171107004355p:plain" title="f:id:miyahan:20171107004355p:plain" class="hatena-fotolife" itemprop="image"></span> <span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20171107/20171107004404.png" alt="f:id:miyahan:20171107004404p:plain" title="f:id:miyahan:20171107004404p:plain" class="hatena-fotolife" itemprop="image"></span></p> <p>やればできるもんですね。</p> <p>日本語検索ができない事に困っている記事をよく見かけましたし、なによりも自分が解決されてほしいと思っていたので勇気を出して日本語対応のプルリクを送ろうと決意しました。</p> <h2>はじめての<a class="keyword" href="http://d.hatena.ne.jp/keyword/OSS">OSS</a>コントリビュート</h2> <p>とはいえプルリクなんて送ったこともないですし、そもそも git もろくに使えず、手に負えなくなったらプロジェクトごと作り直すなんてことをやってるくらいです。でも幸い<a href="https://squidfunk.github.io/mkdocs-material/contributing/">コントリビュートの方法</a>がドキュメントに詳しく書いてあったのでその通り行動しました。</p> <p>プロジェクトを fork して separate git branch でいじれとな。セパレート??ブランチを切れってことかな? で、プルリクを送る前に yarn でビルドしろとな。ビルドしたファイルが必要? ビルドが通ることをチェックする目的?? 他の人のプルリクみるとビルドファイルは push してないのでたぶん後者だ。</p> <p>ひーひー言いながらなんとかプルリクを送信。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20171107/20171107001251.png" alt="f:id:miyahan:20171107001251p:plain" title="f:id:miyahan:20171107001251p:plain" class="hatena-fotolife" itemprop="image"></span></p> <p>おお、なんか自動でコードの品質チェックとビルドが走ってる〜。これが噂に聞く<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B0%DB%C0%A4%B3%A6">異世界</a>の超科学、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B7%D1%C2%B3%C5%AA%A5%A4%A5%F3%A5%C6%A5%B0%A5%EC%A1%BC%A5%B7%A5%E7%A5%F3">継続的インテグレーション</a>!!そして数分後、</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20171107/20171107001952.png" alt="f:id:miyahan:20171107001952p:plain" title="f:id:miyahan:20171107001952p:plain" class="hatena-fotolife" itemprop="image"></span></p> <p>通ったーー!! ヽ(゚∀゚)ノ<br/> 手の平にこんなに汗をかいたのは久しぶりです。</p> <p>そしてさらに翌日…</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20171107/20171107002302.png" alt="f:id:miyahan:20171107002302p:plain" title="f:id:miyahan:20171107002302p:plain" class="hatena-fotolife" itemprop="image"></span></p> <p>キタ━━━( ´∀`)・ω・) ゚Д゚)・∀・) ̄ー ̄)´_ゝ`)━━━!!!!</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20171107/20171107002547.png" alt="f:id:miyahan:20171107002547p:plain" title="f:id:miyahan:20171107002547p:plain" class="hatena-fotolife" itemprop="image"></span></p> <p>泣きそう。</p> <p>そして同日、僕のコミットを取り込んだバージョンが晴れてリリースされました。お仕事が早い。英単語をいくつか和訳しただけではありますが、こうして<strong>人生初めての<a class="keyword" href="http://d.hatena.ne.jp/keyword/OSS">OSS</a>コントリビュート</strong>は無事成功したのでした。</p> <h2>オチ</h2> <p><a href="https://github.com/squidfunk/mkdocs-material/pull/568">プルリク</a>のコメント欄で作者とやりとりしたところ、実は実装は済んでおり以前から設定ひとつで日本語検索を有効化できることが判明。しかし公式ドキュメントの表記が間違っており、自分も含めて誰も使えていない状況だったというオチでした。まあこのやりとりのおかげでドキュメントのミスに気づいて修正できたし、UIが日本語で表示されるというのは紛れもなく機能追加だからよしとしましょう。</p> <p><code>Previous</code> が <code>前</code> になっただけで何がうれしいんだ?と思う方も多いと思いますが、義務教育で習う英単語1つにすら拒絶反応を起こす英語アレルギー持ちの人(というかただの思考停止してる人)がいるため、日本語化はけっこう重要なんです。</p> <h2>Material for MkDocs 日本語対応方法</h2> <p>というわけで最後に日本語表示&日本語検索するための設定方法を紹介します。mkdocs.yml を次のように設定するだけです。</p> <pre class="code lang-yaml" data-lang="yaml" data-unlink><span class="synIdentifier">theme</span><span class="synSpecial">:</span> <span class="synIdentifier">name</span><span class="synSpecial">:</span> <span class="synConstant">'material'</span> <span class="synIdentifier">language</span><span class="synSpecial">:</span> <span class="synConstant">'ja'</span> <span class="synIdentifier">extra</span><span class="synSpecial">:</span> <span class="synIdentifier">search</span><span class="synSpecial">:</span> <span class="synIdentifier">language</span><span class="synSpecial">:</span> <span class="synConstant">'jp'</span> </pre> <p>じつはここに罠がありまして、日本語の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B8%C0%B8%EC%A5%B3%A1%BC%A5%C9">言語コード</a>は ISO 639-1 で <code>ja</code> と決められていますが、lunr-languages はそれを誤って <code>jp</code> で実装してしまっているためいろいろ不都合が生じていました。その対処として上記の通り2種類の言語設定を書く必要があります。</p> <p>なおこの問題は master ブランチでは<a href="https://github.com/MihaiValentin/lunr-languages/pull/33">すでに修正</a>が入っており、次のリリース(lunr-languages 2.0.0?)で <code>ja</code> にリネームされ、<code>jp</code> は <code>ja</code> への<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A8%A5%A4%A5%EA%A5%A2%A5%B9">エイリアス</a>になる予定です。そうなれば、extra/search/language の設定は不要になります。</p> <p>というわけで、<strong>MkDocs + Material は日本語フルサポート</strong>となりました。みなさんぜひ活用なさってください!!</p> miyahan 長時間快適に作業できる監視環境をつくる hatenablog://entry/10328749687202408757 2017-01-05T10:14:08+09:00 2018-04-17T17:12:32+09:00 イケてる監視ツールとかではなく、パソコン本体のおはなしをします。 こんにちは。とある通信会社の委託でネットワークの監視・保守をやっている作業員です(エンジニアじゃないよ)。24時間365日休むこと無く業務を行っていますが、16時間にもなる夜勤をこなすには、快適な作業環境が必要不可欠です。このエントリでは、2015年に行った監視業務用PC・ディスプレイの更改の実体験を通して得られた知見をご紹介したいと思います。 〜忙しい人向けサマリ〜 PCは遅くとも5年で買い替えた方がいい でも同時期に買った機械は同時期に壊れるので分散して買い替えたほうがいい 最近のミニPCは普通に使えるのでおすすめ 高効率電… <p>イケてる監視ツールとかではなく、パソコン本体のおはなしをします。</p> <p>こんにちは。とある通信会社の委託でネットワークの監視・保守をやっている作業員です(エンジニアじゃないよ)。24時間365日休むこと無く業務を行っていますが、16時間にもなる夜勤をこなすには、快適な作業環境が必要不可欠です。このエントリでは、2015年に行った監視業務用PC・ディスプレイの更改の実体験を通して得られた知見をご紹介したいと思います。</p> <p>〜忙しい人向けサマリ〜</p> <ul> <li>PCは遅くとも5年で買い替えた方がいい</li> <li>でも同時期に買った機械は同時期に壊れるので分散して買い替えたほうがいい</li> <li>最近のミニPCは普通に使えるのでおすすめ</li> <li>高効率電源ユニット(80 PLUS)にすると消費電力・発熱が大幅ダウン</li> <li>液体<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C5%C5%B2%F2%A5%B3%A5%F3%A5%C7%A5%F3%A5%B5">電解コンデンサ</a>は低寿命なので、固体<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B3%A5%F3%A5%C7%A5%F3%A5%B5">コンデンサ</a>を使ったPCを選ぼう</li> <li>システムドライブは絶対に<a class="keyword" href="http://d.hatena.ne.jp/keyword/SSD">SSD</a>にしよう。マジ別世界</li> <li>液晶は VA か IPS のものにしよう。TNでピボットするとマジ悲惨</li> <li>ディスプレイは画面サイズだけではなく、ドットピッチも考えて</li> <li>安い液晶は<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D5%A5%EA%A5%C3%A5%AB%A1%BC">フリッカー</a>(チラつき)に注意。<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B7%F2%B9%AF%C2%E8%B0%EC">健康第一</a></li> <li>眼の高さより高くなる大きなディスプレイはドライアイの原因になる</li> <li>ディスプレイは角度だけではなく、高さも調整できるものを選ぼう</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D6%A5%EB%A1%BC%A5%E9%A5%A4%A5%C8">ブルーライト</a>は設定で軽減できる</li> </ul> <p>Update</p> <ul> <li>2017/1/7 : 選定端末の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D9%A5%F3%A5%C1%A5%DE%A1%BC%A5%AF">ベンチマーク</a>結果を追加、ミニコラム「写真を撮ってディスプレイを調整しよう」を追加、その他誤字修正</li> </ul> <hr /> <h3 id="おしながき">おしながき</h3> <ul class="table-of-contents"> <li><a href="#おしながき">おしながき</a></li> <li><a href="#監視環境の故障傾向">監視環境の故障傾向</a></li> <li><a href="#端末に求められる要件">端末に求められる要件</a></li> <li><a href="#端末の機種選定HP-EliteDesk-800-G1-DM">端末の機種選定:HP EliteDesk 800 G1 DM</a><ul> <li><a href="#特徴1小さい">特徴1:小さい</a></li> <li><a href="#特徴2低消費電力低発熱">特徴2:低消費電力・低発熱</a></li> <li><a href="#Coffee-Break-Tera-Term-はGPUで早くなる">[Coffee Break] Tera Term はGPUで早くなる!?</a></li> <li><a href="#Coffee-Break-Energy-Star-対応品を選定しよう">[Coffee Break] Energy Star 対応品を選定しよう</a><ul> <li><a href="#80PLUS">80PLUS</a></li> <li><a href="#ENERGY-STAR">ENERGY STAR</a></li> <li><a href="#メリットしかないのでぜひ選択を">メリットしかないのでぜひ選択を</a></li> </ul> </li> <li><a href="#特徴3高い堅牢性">特徴3:高い堅牢性</a></li> <li><a href="#特徴4十分な性能">特徴4:十分な性能</a></li> </ul> </li> <li><a href="#ディスプレイに求められる要件">ディスプレイに求められる要件</a><ul> <li><a href="#VDT症候群対策">VDT症候群対策</a><ul> <li><a href="#ディスプレイの明るさ">ディスプレイの明るさ</a></li> <li><a href="#文字の大きさ">文字の大きさ</a></li> <li><a href="#画面の高さ">画面の高さ</a></li> <li><a href="#その他">その他</a></li> </ul> </li> <li><a href="#ブルーライト対策">ブルーライト対策</a></li> <li><a href="#Coffee-Break-写真を撮ってディスプレイを調整しよう">[Coffee Break] 写真を撮ってディスプレイを調整しよう</a></li> <li><a href="#ディスプレイの選定条件">ディスプレイの選定条件</a></li> <li><a href="#ディスプレイ配置要件">ディスプレイ配置要件</a></li> </ul> </li> <li><a href="#ディスプレイの選定DELL-U2414H--U2415">ディスプレイの選定:DELL U2414H / U2415</a></li> <li><a href="#さいごに">さいごに</a></li> </ul> <hr /> <h3 id="監視環境の故障傾向">監視環境の故障傾向</h3> <p>監視業務に使っているPCはその性質上24時間つけっぱなしなので、一般的な事務用途よりも早く消耗しがちです。(ちなみに市販のPCは1日約8時間使うことを想定して設計されているそうです)</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20161231/20161231095919.png" alt="f:id:miyahan:20161231095919p:plain" title="f:id:miyahan:20161231095919p:plain" class="hatena-fotolife" itemprop="image"></span></p> <p>私の職場の状況を見てみると、稼働を始めてから3年あたりからパラパラとトラブルが起き始め、<strong>5年目くらいから一気に壊れ出す</strong>傾向がありました。(ただし経年数ではなく、その時々に購入した機種の故障率が現れているだけかもしれません)</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20161231/20161231095929.png" alt="f:id:miyahan:20161231095929p:plain" title="f:id:miyahan:20161231095929p:plain" class="hatena-fotolife" itemprop="image"></span></p> <p>また、故障の内訳は<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%DE%A5%B6%A1%BC%A5%DC%A1%BC%A5%C9">マザーボード</a>上の<strong><a class="keyword" href="http://d.hatena.ne.jp/keyword/%C5%C5%B2%F2%A5%B3%A5%F3%A5%C7%A5%F3%A5%B5">電解コンデンサ</a>不良</strong>(いわゆる妊娠)か、<strong>HDDの<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C9%D4%CE%C9%A5%BB%A5%AF%A5%BF">不良セクタ</a></strong> の2つがほとんどを占めていました。</p> <p>またこれはディスプレイの話なのですが、3年ほど前に10台まとめて買った液晶ディスプレイが<strong>1日のうちに立て続けに6台連続で故障する</strong>という珍事が起きたことがあります。あまりにも同時多発的だったため、当初は電力系統の異常(瞬低・電圧異常・サージ等)を疑ったほどでしたが、バックライト用<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%D0%A1%BC%A5%BF%A1%BC">インバーター</a>の自然故障が偶然同時期に起きたものでした。よく<a class="keyword" href="http://d.hatena.ne.jp/keyword/RAID">RAID</a>で言われる「<strong>同じロットの製品を同じように使ったら同じタイミングで壊れる</strong>」理論が現実のものとなり、機材の同時大量購入のリスクを思い知りました。</p> <p>というわけで今回、5年以上稼働している端末は全て買い替えることにしました。ただし一斉には行わず、購入時期・機種を分散させ、同時故障による業務影響を防止します。</p> <hr /> <h3 id="端末に求められる要件">端末に求められる要件</h3> <p>現場では監視端末に対し、次のような課題がありました。</p> <ul> <li>PC本体を足下に置いているため、足が伸ばせない・たまに蹴飛ばしてしまう</li> <li>消費電力・発熱が多く、部屋が暑い・<a class="keyword" href="http://d.hatena.ne.jp/keyword/UPS">UPS</a>の負荷が限界に近い</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C7%A5%E5%A5%A2%A5%EB%A5%C7%A5%A3%A5%B9%A5%D7%A5%EC%A5%A4">デュアルディスプレイ</a>に対応しているものの、片方が<a class="keyword" href="http://d.hatena.ne.jp/keyword/VGA">VGA</a>ポートのためアナログ接続により映像がボケてしまう</li> <li>一部、<a class="keyword" href="http://d.hatena.ne.jp/keyword/Microsoft%20Office">Microsoft Office</a> が入っていない端末があり不便</li> <li>メモリ2GBだと頻繁に<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%EF%A5%C3%A5%D7">スワップ</a>して動作が重くなりイライラする</li> </ul> <p>以上のことから次の選定条件を決めました。</p> <ul> <li>短寿命なパーツを使ってないこと</li> <li>筐体が小さいこと(可能であれば足元がフリーになること)</li> <li>消費電力・発熱が少ないこと</li> <li>デジタル接続での<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C7%A5%E5%A5%A2%A5%EB%A5%C7%A5%A3%A5%B9%A5%D7%A5%EC%A5%A4">デュアルディスプレイ</a>構成が可能なこと</li> <li>4GB以上のメモリを搭載していること</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/Microsoft%20Office">Microsoft Office</a> がインストールされていること</li> <li>PC本体・ディスプレイ・ソフトウェア一式で1セット20万円以内であること</li> </ul> <hr /> <h3 id="端末の機種選定HP-EliteDesk-800-G1-DM">端末の機種選定:HP EliteDesk 800 G1 DM</h3> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20161231/20161231095943.jpg" alt="f:id:miyahan:20161231095943j:plain" title="f:id:miyahan:20161231095943j:plain" class="hatena-fotolife" itemprop="image"></span></p> <p>別に拡張性は要らないし、でっかい<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D3%A5%C7%A5%AA%A5%AB%A1%BC%A5%C9">ビデオカード</a>も挿さない。ハイエンドCPUをぶん回す作業もしないため、思い切って超小型PC、<a href="https://jp.ext.hp.com/product/business/pc/desktop/800g1dm/">HP EliteDesk 800 G1 DM</a> (下記<a class="keyword" href="http://d.hatena.ne.jp/keyword/BTO">BTO</a>構成にて11万円)を選定しました。</p> <p>※販売終了。現行機種は <s><a href="https://jp.ext.hp.com/desktops/business/elitedesk_800_g2_dm/">EliteDesk 800 G2 DM</a></s> <a href="https://jp.ext.hp.com/desktops/business/elitedesk_800_g3_dm/">EliteDesk 800 G3 DM</a></p> <ul> <li>OS: <a class="keyword" href="http://d.hatena.ne.jp/keyword/Windows%207">Windows 7</a> Professional (64bit)プリインストール(<a class="keyword" href="http://d.hatena.ne.jp/keyword/Windows%208.1">Windows 8.1</a> Proダウングレード) (日本語版)</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D7%A5%ED%A5%BB%A5%C3%A5%B5%A1%BC">プロセッサー</a>: <a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%C6%A5%EB">インテル</a>(R) Core(TM) i5-4590T<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D7%A5%ED%A5%BB%A5%C3%A5%B5%A1%BC">プロセッサー</a> (2C/4T 2.0 GHz)</li> <li>メモリ: 8GB DDR3 <a class="keyword" href="http://d.hatena.ne.jp/keyword/SDRAM">SDRAM</a> SODIMM (4GB x 2)</li> <li>ストレージ: 128GB <a class="keyword" href="http://d.hatena.ne.jp/keyword/SED">SED</a> <a class="keyword" href="http://d.hatena.ne.jp/keyword/SSD">SSD</a>(<a class="keyword" href="http://d.hatena.ne.jp/keyword/SATA">SATA</a>/600, <a class="keyword" href="http://d.hatena.ne.jp/keyword/MLC">MLC</a>)</li> <li>オフィスソフト: <a class="keyword" href="http://d.hatena.ne.jp/keyword/Microsoft%20Office">Microsoft Office</a> Home and Business 2013</li> </ul> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AA%A5%F3%A5%DC%A1%BC%A5%C9">オンボード</a>グラフィックがメインメモリを共有することから、メモリは8GBとやや多めに載せています。また、レスポンス向上とHDDより長寿命かもしれないという淡い期待を込めてシステムディスクを<a class="keyword" href="http://d.hatena.ne.jp/keyword/SSD">SSD</a>にしました。</p> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/Microsoft%20Office">Microsoft Office</a> は<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%DC%A5%EA%A5%E5%A1%BC%A5%E0%A5%E9%A5%A4%A5%BB%A5%F3%A5%B9">ボリュームライセンス</a>より安かったことから<a class="keyword" href="http://d.hatena.ne.jp/keyword/OEM">OEM</a>版を個別にバンドルさせることにしました。その分、シリアルナンバーの管理はめんどくさいですが・・・。</p> <h4 id="特徴1小さい">特徴1:小さい</h4> <p>筐体の容積はわずか1リットルで、ディスプレイの下にすっぽり収まるサイズです。今回はしていませんがVESAマウントに対応しているため、宙に浮かしてフットプリントをゼロにすることも可能です。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20161231/20161231100000.png" alt="f:id:miyahan:20161231100000p:plain" title="f:id:miyahan:20161231100000p:plain" class="hatena-fotolife" itemprop="image"></span></p> <p>PCを載せていたワゴンが必要なくなりデスクの下が開いたことで、<strong>足を自由に伸ばせる</strong>ようになり快適性が向上しました。ひざがボタンに触れて不意にCDドライブのトレイが飛び出しでびっくりすることも、不注意に蹴飛ばしてPCを壊してしまうことももう起きません。</p> <h4 id="特徴2低消費電力低発熱">特徴2:低消費電力・低発熱</h4> <table> <thead> <tr> <th style="text-align:left;"> マシン </th> <th style="text-align:right;"> 消費電力 </th> <th style="text-align:right;"> 年間電気代 </th> </tr> </thead> <tbody> <tr> <td style="text-align:left;"> 旧端末 (<a class="keyword" href="http://d.hatena.ne.jp/keyword/Core2Duo">Core2Duo</a>)<br><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20161231/20161231100952.png" alt="f:id:miyahan:20161231100952p:plain" title="f:id:miyahan:20161231100952p:plain" class="hatena-fotolife" itemprop="image"></span> </td> <td style="text-align:right;"> 79W </td> <td style="text-align:right;"> 2.8万円 </td> </tr> <tr> <td style="text-align:left;"> 旧端末 (第1世代Core i)<br><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20161231/20161231101054.png" alt="f:id:miyahan:20161231101054p:plain" title="f:id:miyahan:20161231101054p:plain" class="hatena-fotolife" itemprop="image"></span> </td> <td style="text-align:right;"> 37W </td> <td style="text-align:right;"> 1.1万円 </td> </tr> <tr> <td style="text-align:left;"> 新端末 (第4世代Core i)<br><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20161231/20161231101116.png" alt="f:id:miyahan:20161231101116p:plain" title="f:id:miyahan:20161231101116p:plain" class="hatena-fotolife" itemprop="image"></span> </td> <td style="text-align:right;"> 7.5W </td> <td style="text-align:right;"> 0.2万円 </td> </tr> </tbody> </table> <p>選定端末は<strong>アイドル時の消費電力がわずか7.5W</strong>で、現行の端末と比べなんと8割以上減となります。電気料金を17.13円/kWh、PUE=2.0 とした場合、<strong>1台あたり年間2万円の電気代を削減</strong>することができます。</p> <p>当然それだけ発熱も少なく、排気口に手を当ててもほとんど熱気を感じません。更改が進めば部屋の温度も下がっていくかもしれません。</p> <h4 id="Coffee-Break-Tera-Term-はGPUで早くなる">[Coffee Break] Tera Term は<a class="keyword" href="http://d.hatena.ne.jp/keyword/GPU">GPU</a>で早くなる!?</h4> <p>新端末ではなぜか Tera Term で大量のログを表示させる時間が早くなっていました。見比べると新端末はテキストのスクロール表示が圧倒的に滑らかになっています。(それでもまだチラつきますが)</p> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/Cisco">Cisco</a> <a class="keyword" href="http://d.hatena.ne.jp/keyword/Catalyst">Catalyst</a> 4506 の show tech-support 取得所要時間を計測してみました。</p> <table> <thead> <tr> <th style="text-align:center;"> </th> <th style="text-align:center;"> 旧端末1 </th> <th style="text-align:center;"> 新端末 </th> <th style="text-align:center;"> 旧端末1(改) </th> </tr> </thead> <tbody> <tr> <td style="text-align:center;"> OS </td> <td style="text-align:center;"> <a class="keyword" href="http://d.hatena.ne.jp/keyword/Windows%20XP">Windows XP</a> </td> <td style="text-align:center;"> <a class="keyword" href="http://d.hatena.ne.jp/keyword/Windows%207">Windows 7</a> 64bit </td> <td style="text-align:center;"> <a class="keyword" href="http://d.hatena.ne.jp/keyword/Windows%20XP">Windows XP</a> </td> </tr> <tr> <td style="text-align:center;"> CPU </td> <td style="text-align:center;"> <a class="keyword" href="http://d.hatena.ne.jp/keyword/Intel">Intel</a> <a class="keyword" href="http://d.hatena.ne.jp/keyword/Core%202%20Duo">Core 2 Duo</a> </td> <td style="text-align:center;"> <a class="keyword" href="http://d.hatena.ne.jp/keyword/Intel">Intel</a> 第4世代 <a class="keyword" href="http://d.hatena.ne.jp/keyword/Core%20i5">Core i5</a> </td> <td style="text-align:center;"> <a class="keyword" href="http://d.hatena.ne.jp/keyword/Intel">Intel</a> <a class="keyword" href="http://d.hatena.ne.jp/keyword/Core%202%20Duo">Core 2 Duo</a> </td> </tr> <tr> <td style="text-align:center;"> <a class="keyword" href="http://d.hatena.ne.jp/keyword/GPU">GPU</a> </td> <td style="text-align:center;"> <a class="keyword" href="http://d.hatena.ne.jp/keyword/Intel">Intel</a> GMA 3100 </td> <td style="text-align:center;"> <a class="keyword" href="http://d.hatena.ne.jp/keyword/Intel">Intel</a> HD Graphics 4600 </td> <td style="text-align:center;"> <a class="keyword" href="http://d.hatena.ne.jp/keyword/NVIDIA">NVIDIA</a> <a class="keyword" href="http://d.hatena.ne.jp/keyword/GeForce">GeForce</a> 210 </td> </tr> <tr> <td style="text-align:center;"> Tera Term </td> <td style="text-align:center;"> Tera Term Pro 2.3 </td> <td style="text-align:center;"> Tera Term 4.86 </td> <td style="text-align:center;"> Tera Term Pro 2.3 </td> </tr> <tr> <td style="text-align:center;"> ログ取得時間 </td> <td style="text-align:center;"> 129s </td> <td style="text-align:center;"> 20s </td> <td style="text-align:center;"> 30s </td> </tr> </tbody> </table> <p>なんと新端末は、<strong>show tech-support 取得時間が6.5倍高速</strong>になりました!そんなバカな...</p> <p>ためしに旧端末にそこそこな外付け<a class="keyword" href="http://d.hatena.ne.jp/keyword/GPU">GPU</a>を取り付けたところ大幅にスピードアップしました。どうやらグラフィック処理能力が関係しているようです。おそらく旧端末はログの転送に対し、画面描写が追いついていないために時間がかかっているものと思われます。</p> <p>というわけでボロいPCを使わされているみなさん。「ログの取得が早くなり障害対応の迅速化が図れます!」と買い換えを提案しましょう!</p> <h4 id="Coffee-Break-Energy-Star-対応品を選定しよう">[Coffee Break] Energy Star 対応品を選定しよう</h4> <p>「いくら省電力でも、そんなオモチャみたいなPCはちょっと・・・」と従来のデスクトップ・タワー型PCを選ぶ方でも、機種や<a class="keyword" href="http://d.hatena.ne.jp/keyword/BTO">BTO</a>オプションの選択によって消費電力・発熱を抑えることができます。</p> <table> <thead> <tr> <th style="text-align:right;"> 機種 </th> <th style="text-align:center;"> <a class="keyword" href="http://d.hatena.ne.jp/keyword/Lenovo">Lenovo</a> ThinkCentre E73 small<span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20161231/20161231102424.png" alt="f:id:miyahan:20161231102424p:plain" title="f:id:miyahan:20161231102424p:plain" class="hatena-fotolife" itemprop="image"></span> </th> <th style="text-align:center;"> HP EliteDesk 800 G1 SF/CT<span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20161231/20161231102439.png" alt="f:id:miyahan:20161231102439p:plain" title="f:id:miyahan:20161231102439p:plain" class="hatena-fotolife" itemprop="image"></span> </th> </tr> </thead> <tbody> <tr> <td style="text-align:right;"> 価格 </td> <td style="text-align:center;"> 11.0万円 </td> <td style="text-align:center;"> 11.0万円 </td> </tr> <tr> <td style="text-align:right;"> CPU </td> <td style="text-align:center;"> <a class="keyword" href="http://d.hatena.ne.jp/keyword/Intel">Intel</a> <a class="keyword" href="http://d.hatena.ne.jp/keyword/Core%20i5">Core i5</a>-4590 </td> <td style="text-align:center;"> <a class="keyword" href="http://d.hatena.ne.jp/keyword/Intel">Intel</a> <a class="keyword" href="http://d.hatena.ne.jp/keyword/Core%20i5">Core i5</a>-4590 </td> </tr> <tr> <td style="text-align:right;"> メモリ </td> <td style="text-align:center;"> DDR3 4GB </td> <td style="text-align:center;"> DDR3 8GB </td> </tr> <tr> <td style="text-align:right;"> ストレージ </td> <td style="text-align:center;"> <a class="keyword" href="http://d.hatena.ne.jp/keyword/SATA">SATA</a> 500GB HDD </td> <td style="text-align:center;"> <a class="keyword" href="http://d.hatena.ne.jp/keyword/SATA">SATA</a> 500GB HDD </td> </tr> <tr> <td style="text-align:right;"> サポート </td> <td style="text-align:center;"> 1年オンサイト保守 </td> <td style="text-align:center;"> 3年オンサイト保守 </td> </tr> <tr> <td style="text-align:right;"> ENERGY STAR </td> <td style="text-align:center;"> (対応不可) </td> <td style="text-align:center;"> ENERGY STAR 6.0 構成オプション </td> </tr> <tr> <td style="text-align:right;"> 消費電力 </td> <td style="text-align:center;"> <strong><span style="font-size: 150%">45</span>W</strong> </td> <td style="text-align:center;"> <strong><span style="font-size: 150%">17</span>W</strong> </td> </tr> </tbody> </table> <p>このように<strong>同じような価格・スペックでも6割以上消費電力を削減</strong>することが可能です。キーワードは "<strong>80PLUS</strong>" と "<strong>ENERGY STAR</strong>" です。</p> <h5 id="80PLUS">80PLUS</h5> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20161231/20161231105913.png" alt="f:id:miyahan:20161231105913p:plain" title="f:id:miyahan:20161231105913p:plain" class="hatena-fotolife" itemprop="image"></span></p> <p><a href="https://ja.wikipedia.org/wiki/80_PLUS">80PLUS</a> とは<a class="keyword" href="http://d.hatena.ne.jp/keyword/AC/DC">AC/DC</a>変換効率が80%以上の電源ユニットを示す認証です(従来の電源ユニットの変換効率は60%前後)。熱になってロスするエネルギーが少なくなるので低発熱・省電力なPCを構築することができます。上記 HP EliteDesk 800 G1 SF/CT Energy Star 6.0 構成の例では、変換効率90%以上を誇る 80PLUS PRATINUM 認証の電源ユニットが搭載されていました。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20161231/20161231104504.jpg" alt="f:id:miyahan:20161231104504j:plain" title="f:id:miyahan:20161231104504j:plain" class="hatena-fotolife" itemprop="image"></span><br>HP EliteDesk 800 G1 SF/CT Energy Star 6.0 構成 電源ユニット</p> <h5 id="ENERGY-STAR">ENERGY STAR</h5> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20161231/20161231105808.png" alt="f:id:miyahan:20161231105808p:plain" title="f:id:miyahan:20161231105808p:plain" class="hatena-fotolife" itemprop="image"></span></p> <p><a href="https://www.energystar.gov">ENERGY STAR(アメリカ環境保護庁)</a> / <a href="http://www.energystar.jp/">国際エネルギースタープログラム(経済産業省)</a> は<a class="keyword" href="http://d.hatena.ne.jp/keyword/%BE%CA%A5%A8%A5%CD%A5%EB%A5%AE%A1%BC">省エネルギー</a>なOA機器に与えられる認証で、電源ユニットの電力変換効率(81%以上)をはじめ、アイドル時・スリープ時・電源OFF時の消費電力、さらにはスリープモードに移行するまで時間まで細かな規定があります。ENERGY STAR 認証を得るには 80PLUS 電源の搭載が必須となるため、80PLUS ⊂ Energy Star という関係になっています。</p> <h5 id="メリットしかないのでぜひ選択を">メリットしかないのでぜひ選択を</h5> <p>多くの企業が果たすべき<a class="keyword" href="http://d.hatena.ne.jp/keyword/CSR">CSR</a>として「環境(エコ)」を掲げていると思います。部屋の冷房が効きやすいといった実際に享受できるメリットもありますので、ぜひ 80PLUS認証電源を積んだPC、ENERGY STAR 認証PC を選定しましょう。多くのメーカーで標準対応 または <a class="keyword" href="http://d.hatena.ne.jp/keyword/BTO">BTO</a>オプションで選択できます。</p> <p>ただし <a class="keyword" href="http://d.hatena.ne.jp/keyword/DELL">DELL</a> は 高効率電源 / ENERGY STAR 構成オプションが用意されているもののオンライン<a class="keyword" href="http://d.hatena.ne.jp/keyword/BTO">BTO</a>では選択できず、<a class="keyword" href="http://d.hatena.ne.jp/keyword/DELL">DELL</a>の法人営業担当に特注する必要があります。売る気は無いが嫌々用意した感じですかね・・・?</p> <h4 id="特徴3高い堅牢性">特徴3:高い堅牢性</h4> <p>HP EliteDesk 800 G1 DM はなぜか<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A2%A5%E1%A5%EA%A5%AB%B9%F1%CB%C9%C1%ED%BE%CA">アメリカ国防総省</a>の米軍調達品規格(MIL-STD-810G)の基準に適合しており、高い堅牢性をウリにしています。</p> <p><a href="http://pc.watch.impress.co.jp/docs/column/hothot/652428.html">&#x3010;Hothot&#x30EC;&#x30D3;&#x30E5;&#x30FC;&#x3011;&#x65E5;&#x672C;HP&#x300C;HP EliteDesk 800 G1 DM&#x300D; &#xFF5E;&#x5BB9;&#x7A4D;&#x7D04;1L&#x3067;&#x9AD8;&#x6027;&#x80FD;&#x306A;&#x30D3;&#x30B8;&#x30CD;&#x30B9;&#x30C7;&#x30B9;&#x30AF;&#x30C8;&#x30C3;&#x30D7; - PC Watch</a></p> <p>また、上記レビューの写真を見るかぎり耐久性の低い液体<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C5%C5%B2%F2%A5%B3%A5%F3%A5%C7%A5%F3%A5%B5">電解コンデンサ</a>は使われておらず、すべて 15,000時間/105℃ の高い耐久性を持つ <a class="keyword" href="http://d.hatena.ne.jp/keyword/%C6%FC%CB%DC%A5%B1%A5%DF%A5%B3%A5%F3">日本ケミコン</a>のアルミ固体<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C5%C5%B2%F2%A5%B3%A5%F3%A5%C7%A5%F3%A5%B5">電解コンデンサ</a>(<a href="http://www.chemi-con.co.jp/catalog/pdf/al-j/al-sepa-j/002-cp/al-pxg-j-160401.pdf">NPCAP-PXG</a> および <a href="http://www.chemi-con.co.jp/catalog/pdf/al-j/al-sepa-j/002-cp/al-pxk-j-160401.pdf">NPCAP-PXK</a>) が使われているように見えます。だからといって壊れないわけではありませんが、日本製は安心感があります。</p> <h4 id="特徴4十分な性能">特徴4:十分な性能</h4> <p>小型PCで最も気になるのは処理能力だと思います。業務で使っている3種類の端末を比べてみます。</p> <table> <thead> <tr> <th style="text-align:right;"> </th> <th style="text-align:center;"> HP 8100Elite <a class="keyword" href="http://d.hatena.ne.jp/keyword/SFF">SFF</a> </th> <th style="text-align:center;"> <a class="keyword" href="http://d.hatena.ne.jp/keyword/Lenovo">Lenovo</a> E73 small </th> <th style="text-align:center;"> HP 800 G1 DM </th> </tr> </thead> <tbody> <tr> <td style="text-align:right;"> CPU </td> <td style="text-align:center;"> <a class="keyword" href="http://d.hatena.ne.jp/keyword/Intel">Intel</a> <a class="keyword" href="http://d.hatena.ne.jp/keyword/Core%20i5">Core i5</a> 650(1st Gen) </td> <td style="text-align:center;"> <a class="keyword" href="http://d.hatena.ne.jp/keyword/Intel">Intel</a> <a class="keyword" href="http://d.hatena.ne.jp/keyword/Core%20i5">Core i5</a>-4570S(4th Gen) </td> <td style="text-align:center;"> <a class="keyword" href="http://d.hatena.ne.jp/keyword/Intel">Intel</a> <a class="keyword" href="http://d.hatena.ne.jp/keyword/Core%20i5">Core i5</a>-4590T(4th Gen) </td> </tr> <tr> <td style="text-align:right;"> RAM </td> <td style="text-align:center;"> DDR3 2GB x 2 </td> <td style="text-align:center;"> DDR3 4GB x 1 </td> <td style="text-align:center;"> DDR3 4GB x 2 </td> </tr> <tr> <td style="text-align:right;"> <a class="keyword" href="http://d.hatena.ne.jp/keyword/GPU">GPU</a> </td> <td style="text-align:center;"> <a class="keyword" href="http://d.hatena.ne.jp/keyword/AMD">AMD</a> <a class="keyword" href="http://d.hatena.ne.jp/keyword/Radeon">Radeon</a> HD 6350 </td> <td style="text-align:center;"> <a class="keyword" href="http://d.hatena.ne.jp/keyword/Intel">Intel</a> HD Graphics 4600 </td> <td style="text-align:center;"> <a class="keyword" href="http://d.hatena.ne.jp/keyword/Intel">Intel</a> HD Graphics 4600 </td> </tr> <tr> <td style="text-align:right;"> Disk </td> <td style="text-align:center;"> 160GB 7200rpm HDD </td> <td style="text-align:center;"> 500GB 7200rpm HDD </td> <td style="text-align:center;"> 128GB <a class="keyword" href="http://d.hatena.ne.jp/keyword/MLC">MLC</a> <a class="keyword" href="http://d.hatena.ne.jp/keyword/SSD">SSD</a> </td> </tr> </tbody> </table> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/Windows">Windows</a> 標準のエクス<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%DA%A5%EA%A5%A8">ペリエ</a>ンスインデックスと、<a class="keyword" href="http://d.hatena.ne.jp/keyword/CrystalMark">CrystalMark</a> 2004 で<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D9%A5%F3%A5%C1%A5%DE%A1%BC%A5%AF">ベンチマーク</a>を行いました。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20170107/20170107192722.png" alt="f:id:miyahan:20170107192722p:plain" title="f:id:miyahan:20170107192722p:plain" class="hatena-fotolife" itemprop="image"></span></p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20170107/20170107192739.png" alt="f:id:miyahan:20170107192739p:plain" title="f:id:miyahan:20170107192739p:plain" class="hatena-fotolife" itemprop="image"></span></p> <p>通常のデスクトップ版と比べ、<strong>低電圧版Core i の処理能力は2割程度落ちる</strong>ようです。だいたい1〜2世代前のデスクトップCPUといった感じでしょうか。</p> <p>ところで、HP 800 G1 DM で <a class="keyword" href="http://d.hatena.ne.jp/keyword/Windows">Windows</a> の電源管理ポリシーを「省電力」に変更したところ、一部のWebアプリで <a class="keyword" href="http://d.hatena.ne.jp/keyword/JavaScript">JavaScript</a> の動作が重くなる現象が起きました。設定をデフォルトの「バランス」に戻すと収まったので、今はそれで運用しています。「省電力」設定ではクロック周波数をなかなか上げようとしないため、特に最低動作クロックの低い低電圧版 Core i ではその影響が顕著に出たものと思われます。</p> <p>グラフィックに関しては、メモリを多く積んだためか、それともデュアルチャネル構成にしたためか、<strong>2Dグラフィックス</strong>のスコアが大幅に向上しています。同じ <a class="keyword" href="http://d.hatena.ne.jp/keyword/Intel">Intel</a> HD Graphics 4600 を積んだ <a class="keyword" href="http://d.hatena.ne.jp/keyword/Lenovo">Lenovo</a> E73 small と比べても 1.5 〜 1.8倍高速です。この伸びが Tera Term の表示速度に貢献したのでしょうか。</p> <p>まとめると<strong>ミニPCでも全く問題なかった</strong>という感想です。もっとパワーが欲しければ 低電圧版<a class="keyword" href="http://d.hatena.ne.jp/keyword/Core%20i7">Core i7</a> にするという選択肢もあります。そして処理能力以上にとにかく<a class="keyword" href="http://d.hatena.ne.jp/keyword/SSD">SSD</a>の威力が絶大でした。OSやアプリの起動が爆速でストレスなく作業できます。現場からも「こんな小さいのにキビキビ動くね!」と好評です。<strong>この新端末を触った後にHDD機を触ると、日本語入力ですらも<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A4%BF%A4%C4%A4%AD">たつき</a>を感じてイライラ</strong>してきます。同時期に買った <a class="keyword" href="http://d.hatena.ne.jp/keyword/Lenovo">Lenovo</a> E73 small ですら買い替えて欲しいという声があがるほどです。もうすでに<strong><a class="keyword" href="http://d.hatena.ne.jp/keyword/SSD">SSD</a>はマスト</strong>な時代です。</p> <p>デスクトップPCは大きいけど、NUCではさすがに力不足。そんな両者の間を埋める素晴らしいプロダクトに出会えました。おすすめします。</p> <hr /> <h3 id="ディスプレイに求められる要件">ディスプレイに求められる要件</h3> <p>次はディスプレイです。つぎのような課題、というか失敗談がありました。</p> <ul> <li>端末増設のため <a class="keyword" href="http://d.hatena.ne.jp/keyword/DELL">DELL</a> の IPS液晶ディスプレイを選定したところ、課長が勝手に「<a class="keyword" href="http://d.hatena.ne.jp/keyword/DELL">DELL</a>の安物よりこっちのほうがいいだろ」と <a class="keyword" href="http://d.hatena.ne.jp/keyword/EIZO">EIZO</a> S2401W (TN液晶)に変更して発注。<strong>壊滅的に視野角が狭く左目と右目で見える映像が違う</strong>という酷さで即お蔵入り。60万円をドブに捨てる。</li> <li>どこで聞きかじってきたのか、課長が「疲れ目防止のために<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D6%A5%EB%A1%BC%A5%E9%A5%A4%A5%C8">ブルーライト</a>対策をしよう!」と1枚1万円近くする<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D6%A5%EB%A1%BC%A5%E9%A5%A4%A5%C8">ブルーライト</a>カットパネルを導入。しかし、照明が乱反射して逆に目が疲れる、パネルの縁や固定用粘着テープがジャマで文字が読めないなど非難囂々で、即剥がして破棄した。5万円をドブに捨てる。</li> <li>予算が余ったとかで、安物の<a class="keyword" href="http://d.hatena.ne.jp/keyword/LED%A5%D0%A5%C3%A5%AF%A5%E9%A5%A4%A5%C8">LEDバックライト</a>の液晶ディスプレイを購入したところ、<strong>チラつき(<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D5%A5%EA%A5%C3%A5%AB%A1%BC">フリッカー</a>)が酷く、使用者に目の疲れや頭痛</strong>などの症状が出た。社員の健康をドブに捨てる。</li> <li>27インチ WQHD の液晶ディスプレイを購入したところ、<strong>文字が小さくて見えづらい</strong>という意見が出た。たぶんそれは老眼鏡買った方がいい。</li> </ul> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20170106/20170106225107.jpg" alt="f:id:miyahan:20170106225107j:plain" title="f:id:miyahan:20170106225107j:plain" class="hatena-fotolife" itemprop="image"></span> → <span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20170106/20170106225113.jpg" alt="f:id:miyahan:20170106225113j:plain" title="f:id:miyahan:20170106225113j:plain" class="hatena-fotolife" itemprop="image"></span><br>TN液晶とIPS液晶の比較。<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A4%B3%A4%EC%A4%CF%A4%D2%A4%C9%A4%A4">これはひどい</a>。</p> <p>うちの社員はパソコンも満足に選べないのか・・・!?</p> <p>ディスプレイのスペック不足については良いものを選べばよいだけのことですが、疲れ目対策や適正な文字サイズについては考察が必要だと感じました。</p> <h4 id="VDT症候群対策"><a class="keyword" href="http://d.hatena.ne.jp/keyword/VDT%BE%C9%B8%F5%B7%B2">VDT症候群</a>対策</h4> <p>パソコンを長時間使った際の疲れ目や肩こりといった症状は、一般的に「<a class="keyword" href="http://d.hatena.ne.jp/keyword/VDT%BE%C9%B8%F5%B7%B2">VDT症候群</a>」と呼ばれています。<a href="https://ja.wikipedia.org/wiki/VDT%E7%97%87%E5%80%99%E7%BE%A4">Wikipedia</a> では次のよう定義されています。</p> <blockquote><p><a class="keyword" href="http://d.hatena.ne.jp/keyword/VDT%BE%C9%B8%F5%B7%B2">VDT症候群</a>とは、コンピュータのディスプレイなど表示機器を使用した作業(<a class="keyword" href="http://d.hatena.ne.jp/keyword/VDT">VDT</a>作業ともいう)を長時間続けたことにより、目や体、心に支障をきたす病気のことである。別名テクノストレス眼症とも呼ばれる。</p></blockquote> <p>この対策として、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B8%FC%C0%B8%CF%AB%C6%AF%BE%CA">厚生労働省</a>が「<a href="http://www.mhlw.go.jp/houdou/2002/04/h0405-4.html">VDT作業における労働衛生管理のためのガイドライン</a>」という<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AC%A5%A4%A5%C9%A5%E9%A5%A4%A5%F3">ガイドライン</a>を制定しており、今回これを参考に検討を進めました。</p> <h5 id="ディスプレイの明るさ">ディスプレイの明るさ</h5> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AC%A5%A4%A5%C9%A5%E9%A5%A4%A5%F3">ガイドライン</a>には次のような規定がありました。</p> <ul> <li>ディスプレイ画面上における照度は500ルクス以下</li> <li>書類上及びキーボード上における照度は300ルクス以上</li> <li>ディスプレイ画面の明るさ、書類及びキーボード面における明るさと周辺の明るさの差はなるべく小さくする</li> </ul> <p>というわけで、さっそく職場の環境光を測定してみました。デスクの直角方向の照度は540ルクス、ディスプレイの直角方向の照度は230ルクスで<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AC%A5%A4%A5%C9%A5%E9%A5%A4%A5%F3">ガイドライン</a>を満たしており、照明に手を加える必要はありませんでした。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20170104/20170104173228.png" alt="f:id:miyahan:20170104173228p:plain" title="f:id:miyahan:20170104173228p:plain" class="hatena-fotolife" itemprop="image"></span></p> <p>次にディスプレイの輝度ですが、要するにディスプレイと紙を同じ明るさにしろということです。今回、照明<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B3%A5%F3%A5%B5%A5%EB%A5%BF%A5%F3%A5%C8">コンサルタント</a>をされているシーシー<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A8%A5%B9">エス</a>株式会社様が公開している「光と色の話 | 反射面における照度と輝度の関係」を参考に適正な輝度を求めました。</p> <p><iframe src="https://hatenablog-parts.com/embed?url=http%3A%2F%2Fwww.ccs-inc.co.jp%2Fs2_ps%2Fs1%2Fs_04%2Fcolumn%2Flight_color%2Fvol10.html" title="第10回 反射面における照度と輝度の関係|CCS:シーシーエス株式会社" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;"></iframe></p> <p>紙を均一に拡散反射する物体と見なし、その反射率を 𝜌 としたとき、環境光の照度 𝐸 (lx) に対する書類の反射光の輝度 𝐿 (cd/m<sup>2</sup>) は次の通りに求められます。</p> <p>𝐿 = (𝜌/𝜋)𝐸</p> <p>コピー用紙の白色度=反射率 は 70〜80 程度ですから、上の式を使って<strong>適正輝度を 120cd/m<sup>2</sup> に決定</strong>しました。</p> <h5 id="文字の大きさ">文字の大きさ</h5> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AC%A5%A4%A5%C9%A5%E9%A5%A4%A5%F3">ガイドライン</a>には「ディスプレイに表示する文字の大きさは、小さすぎないように配慮し、文字高さが概ね3 mm以上とするのが望ましい」とあります。この根拠が次のように書かれています。</p> <blockquote><p>文字の大きさは、視距離によって最適な大きさが変動するため、視角(単位は分:1度の60分の1)でその要求値が決められている。<br>英数文字の場合には、読みやすさを確保するためには一般に16分以上がよく、20分~22分が特に推奨される。また、漢字などを表示する場合には一般に20分以上がよく、25分~35分程度が特に推奨される。視距離50cmで、20分が約2.9mmとなることから、ここでは概ね3mm以上とした。<br>一般に文字の大きさは、作業者が、10ポイント、12ポイントなどと自由に設定できる場合が多いが、そのポイント数はディスプレイのサイズや種々の設定条件によって、必ずしも文字の物理的な大きさとは一致しないことに留意すること。</p></blockquote> <p>図にするとこんな感じです。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20170104/20170104180231.png" alt="f:id:miyahan:20170104180231p:plain" title="f:id:miyahan:20170104180231p:plain" class="hatena-fotolife" itemprop="image"></span></p> <p>視距離を 𝑑 (mm)、視角を 𝑎 (分) としたとき、必要な文字の大きさ ℎ<sub>1</sub> (mm) は以下の計算式より求められます。</p> <p>ℎ<sub>1</sub> = 2𝑑∙sin(𝑎𝜋/(2∙60∙180))</p> <p>一方、ドットピッチ 𝑝 (mm/pixel) のディスプレイで、<a class="keyword" href="http://d.hatena.ne.jp/keyword/Windows%207">Windows 7</a> の標準解像度における 𝑠 (pt) の文字を表示したときの文字の高さ ℎ2 (mm) は以下の計算式より求めらます。</p> <p>ℎ<sub>2</sub> = (96/72)𝑠𝑝</p> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AC%A5%A4%A5%C9%A5%E9%A5%A4%A5%F3">ガイドライン</a>に適合するには ℎ<sub>1</sub> ≥ ℎ<sub>2</sub> 満たす必要があります。</p> <p>ところで社内独自のトラブルチケットシステムはUIが昭和の香り漂う帳票風デザインで、各フォームがガチガチに固定されており、フォントサイズを標準の 9pt 以外に変更することができません。<a class="keyword" href="http://d.hatena.ne.jp/keyword/Windows%207">Windows 7</a> の拡大機能使ったとしてもレイアウトが崩れて使い物になりません。そのため、上の式から 0.242mm/pixel 以上のドットピッチを持ったディスプレイを選定するべきことがわかりました。</p> <p>表:各ディスプレイ解像度での文字の高さ[mm]</p> <table> <thead> <tr> <th style="text-align:right;"> </th> <th style="text-align:center;"> 21.5" FHD </th> <th style="text-align:center;"> 23.8" FHD </th> <th style="text-align:center;"> 24.1" <a class="keyword" href="http://d.hatena.ne.jp/keyword/WUXGA">WUXGA</a> </th> <th style="text-align:center;"> 27.0" WQHD </th> <th style="text-align:center;"> 29.8" WQXGA </th> </tr> </thead> <tbody> <tr> <td style="text-align:right;"> 7pt </td> <td style="text-align:center;"> × : 2.31 </td> <td style="text-align:center;"> × : 2.56 </td> <td style="text-align:center;"> × : 2.52 </td> <td style="text-align:center;"> × : 2.18 </td> <td style="text-align:center;"> × : 2.33 </td> </tr> <tr> <td style="text-align:right;"> 8pt </td> <td style="text-align:center;"> × : 2.65 </td> <td style="text-align:center;"> × : 2.93 </td> <td style="text-align:center;"> × : 2.88 </td> <td style="text-align:center;"> × : 2.49 </td> <td style="text-align:center;"> × : 2.67 </td> </tr> <tr> <td style="text-align:right;"> 9pt </td> <td style="text-align:center;"> × : 2.98 </td> <td style="text-align:center;"> ○ : 3.29 </td> <td style="text-align:center;"> ○ : 3.24 </td> <td style="text-align:center;"> × : 2.80 </td> <td style="text-align:center;"> ○ : 3.00 </td> </tr> <tr> <td style="text-align:right;"> 10pt </td> <td style="text-align:center;"> ○ : 3.31 </td> <td style="text-align:center;"> ○ : 3.66 </td> <td style="text-align:center;"> ○ : 3.60 </td> <td style="text-align:center;"> ○ : 3.11 </td> <td style="text-align:center;"> ○ : 3.33 </td> </tr> <tr> <td style="text-align:right;"> 11pt </td> <td style="text-align:center;"> ○ : 3.64 </td> <td style="text-align:center;"> ○ : 4.03 </td> <td style="text-align:center;"> ○ : 3.96 </td> <td style="text-align:center;"> ○ : 3.42 </td> <td style="text-align:center;"> ○ : 3.67 </td> </tr> <tr> <td style="text-align:right;"> 12pt </td> <td style="text-align:center;"> ○ : 3.97 </td> <td style="text-align:center;"> ○ : 4.39 </td> <td style="text-align:center;"> ○ : 4.32 </td> <td style="text-align:center;"> ○ : 3.73 </td> <td style="text-align:center;"> ○ : 4.00 </td> </tr> </tbody> </table> <p>つまり 21インチ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D5%A5%EBHD">フルHD</a> と 27インチWQHD は不適ということです。</p> <p>まあ、4K だの <a class="keyword" href="http://d.hatena.ne.jp/keyword/Retina">Retina</a> Display だの言っている時代に、文字サイズからディスプレイの仕様を決めるなど、時代遅れも甚だしい話ではありますが・・・</p> <h5 id="画面の高さ">画面の高さ</h5> <p>画面の高さについて、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AC%A5%A4%A5%C9%A5%E9%A5%A4%A5%F3">ガイドライン</a>には「ディスプレイは、その画面の上端が眼の高さとほぼ同じか、やや下になる高さにすることが望ましい」と書かれています。これは<strong>画面を見上げる(視線を水平より上げる)と涙の分泌が減りドライアイの原因になる</strong>ためです。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20170104/20170104235317.png" alt="f:id:miyahan:20170104235317p:plain" title="f:id:miyahan:20170104235317p:plain" class="hatena-fotolife" itemprop="image"></span></p> <p>もし画面を90度回転(ピボット)させて縦長にして使う場合、24インチを超えると画面の上端が眼より高くなり不適です。また、大型テレビをPCディスプレイとして使う場合にも高さに注意が必要です。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20170106/20170106215116.png" alt="f:id:miyahan:20170106215116p:plain" title="f:id:miyahan:20170106215116p:plain" class="hatena-fotolife" itemprop="image"></span></p> <p>また<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AC%A5%A4%A5%C9%A5%E9%A5%A4%A5%F3">ガイドライン</a>には「ディスプレイ画面の位置、前後の傾き、左右の向き等を調整させること」とも書かれています。たいていの製品には画面の角度調整機能(チルト)が付いていますが、一部の安い製品では高さ調節機能(昇降機能)がないものがあります。<strong>支柱のない低いスタンドだと画面を上からのぞき込むような姿勢になり、肩こりや猫背の原因になります</strong>。</p> <p>特に画面の位置が低くなりがちな<strong>ノートPCはストレートネック等の深刻な健康問題を生じさせるリスクがある</strong>ためデスクトップPCを選びたいところです。メインマシンがラップトップPCの方は、長時間作業する場合にPC本体をスタンドに置いて高さを稼ぎつつ、外付けキーボードをつないで使うことをおすすめします。</p> <h5 id="その他">その他</h5> <p>そのほか、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AC%A5%A4%A5%C9%A5%E9%A5%A4%A5%F3">ガイドライン</a>にはディスプレイ性能・仕様について次のような規定があります。</p> <ul> <li>反射防止型ディスプレイを用いること</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D5%A5%EA%A5%C3%A5%AB%A1%BC">フリッカー</a>は、知覚されないものであること</li> </ul> <h4 id="ブルーライト対策"><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D6%A5%EB%A1%BC%A5%E9%A5%A4%A5%C8">ブルーライト</a>対策</h4> <p>数年前から唐突に叫ばれるようになった "<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D6%A5%EB%A1%BC%A5%E9%A5%A4%A5%C8">ブルーライト</a>"。学術的には "<a href="https://ja.wikipedia.org/wiki/%E9%AB%98%E3%82%A8%E3%83%8D%E3%83%AB%E3%82%AE%E3%83%BC%E5%8F%AF%E8%A6%96%E5%85%89%E7%B7%9A">高エネルギー可視光線</a>" (HEV Light) と呼ばれており、380nm 〜 530nm 程度の波長の短い可視光のことを指すようで、大きく分けて次の2つの問題が引き起こされると言われています。</p> <ol> <li>比較的高いエネルギーを持った光線を受けることによる網膜損傷・眼精疲労</li> <li>視交叉上核が刺激されることによる体内時計の乱れ・<a class="keyword" href="http://d.hatena.ne.jp/keyword/%BF%E7%CC%B2%BE%E3%B3%B2">睡眠障害</a></li> </ol> <p>まあ紫外線に近い光なんだからそれなりに害もあるでしょう、という感じでしょうか。<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D6%A5%EB%A1%BC%A5%E9%A5%A4%A5%C8">ブルーライト</a>カットメガネや<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D6%A5%EB%A1%BC%A5%E9%A5%A4%A5%C8">ブルーライト</a>カットフィルム、はたまた謎の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B5%A5%D7%A5%EA%A5%E1%A5%F3%A5%C8">サプリメント</a>までさまざまなグッズが売られていますが、PC用ディスプレイの場合、対策は簡単です。<strong><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D6%A5%EB%A1%BC%A5%E9%A5%A4%A5%C8">ブルーライト</a>を減らしたいのならブルーを減らせばよい</strong>のです。</p> <p>幸い私の職場は環境光が 4100K と低めで、ディスプレイの<a class="keyword" href="http://d.hatena.ne.jp/keyword/%BF%A7%B2%B9%C5%D9">色温度</a>を下げても違和感が起きないと判断し4500Kに設定することにしました。<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AD%A5%E3%A5%EA%A5%D6%A5%EC%A1%BC%A5%B7%A5%E7%A5%F3">キャリブレーション</a>したディスプレイをスペクトル測定した結果がこちらです。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20170104/20170104231149.png" alt="f:id:miyahan:20170104231149p:plain" title="f:id:miyahan:20170104231149p:plain" class="hatena-fotolife" itemprop="image"></span></p> <p><strong><a class="keyword" href="http://d.hatena.ne.jp/keyword/%BF%A7%B2%B9%C5%D9">色温度</a>を下げることで<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D6%A5%EB%A1%BC%A5%E9%A5%A4%A5%C8">ブルーライト</a>成分が大幅に軽減</strong>されていることがわかります。ブルーを減らしたら<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D6%A5%EB%A1%BC%A5%E9%A5%A4%A5%C8">ブルーライト</a>が減った。あたりまえの話ですね。<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D6%A5%EB%A1%BC%A5%E9%A5%A4%A5%C8">ブルーライト</a>カットフィルムなんてバカげたグッズは必要ないのです。</p> <p>ちなみに<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D6%A5%EB%A1%BC%A5%E9%A5%A4%A5%C8">ブルーライト</a>が気になって仕方ない方は、いますぐ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%DE%A1%BC%A5%C8%A5%D5%A5%A9%A5%F3">スマートフォン</a>を最新の <a class="keyword" href="http://d.hatena.ne.jp/keyword/iPhone">iPhone</a> に買い替えましょう。Night Shift 機能は最強です。</p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fmiyalog.hatenablog.jp%2Fentry%2F20160404-iPad_Pro_9.7_display" title="9.7インチ iPad Pro ディスプレイレビュー - miyalog" class="embed-card embed-blogcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;"></iframe></p> <h4 id="Coffee-Break-写真を撮ってディスプレイを調整しよう">[Coffee Break] 写真を撮ってディスプレイを調整しよう</h4> <p>今回の取り組みでは、私物の分光型測色計 x-rite ColorMunki Photo を使って検証・設定を行いました。でも専門の機材がなくともディスプレイを適切にセッティングすることができます。</p> <p>適当な雑誌や書類を用意し、ディスプレイと見比べてみましょう。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20170107/20170107212140.jpg" alt="f:id:miyahan:20170107212140j:plain" title="f:id:miyahan:20170107212140j:plain" class="hatena-fotolife" itemprop="image"></span>  <span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20170107/20170107212148.jpg" alt="f:id:miyahan:20170107212148j:plain" title="f:id:miyahan:20170107212148j:plain" class="hatena-fotolife" itemprop="image"></span></p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20170107/20170107212251.jpg" alt="f:id:miyahan:20170107212251j:plain" title="f:id:miyahan:20170107212251j:plain" class="hatena-fotolife" itemprop="image"></span></p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20170107/20170107212224.jpg" alt="f:id:miyahan:20170107212224j:plain" title="f:id:miyahan:20170107212224j:plain" class="hatena-fotolife" itemprop="image"></span>  <span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20170107/20170107212231.jpg" alt="f:id:miyahan:20170107212231j:plain" title="f:id:miyahan:20170107212231j:plain" class="hatena-fotolife" itemprop="image"></span></p> <p>明るさ・<a class="keyword" href="http://d.hatena.ne.jp/keyword/%BF%A7%B2%B9%C5%D9">色温度</a>は合っていましたか?もし合っていないのであればディスプレイの設定を調整してください。<a class="keyword" href="http://d.hatena.ne.jp/keyword/%BF%A7%B2%B9%C5%D9">色温度</a>を調整する場合はまずブルーのゲインを落とし、そのあと色が自然になるようにグリーンを微調整していくのがコツです。</p> <p>カメラを使うとさらに効果的です。肉眼で見ると脳が物体ごとの明るさや色を無意識に補正してしまいますが、写真ではそれが起きづらいため差がわかりやすくなります。さらにカメラはヒトの眼より捉えられる明るさの幅(ラティチュード)が狭い、つまり白飛び・黒潰れしやすいため明るさの差に気づきやすくなります。</p> <p>部屋の風景をオート露出・カスタムホワイトバランスで撮影したあと、そのパラメーターをマニュアル撮影モードで設定しディスプレイを撮影することで、明るさ・色の対比ができます。<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%DE%A1%BC%A5%C8%A5%D5%A5%A9%A5%F3">スマートフォン</a>など簡易的なカメラでしたら、上記の写真のように紙とディスプレイを1枚に入れて撮影して見るのがよいでしょう。</p> <h4 id="ディスプレイの選定条件">ディスプレイの選定条件</h4> <p>長くなりましたが、以上の調査結果から選定条件を次のように決めました。</p> <ul> <li>輝度を無理なく 120cd/m<sup>2</sup> に調整できること</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%BF%A7%B2%B9%C5%D9">色温度</a>を無理なく 4500K に調整できること</li> <li>ドットピッチが 0.242mm/pixel 以上であること</li> <li>広視野角であること (VA または IPSモードのもの)</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D5%A5%EA%A5%C3%A5%AB%A1%BC">フリッカー</a>が起きないこと (バックライトが 電圧制御 または 高速タイプのPVM制御 のもの)</li> <li>画面の上端が眼の高さ以下になること</li> <li>画面の回転(ピボット)ができること(後述)</li> <li>画面がノングレア処理されていること</li> <li>画面の高さ・上下角が調節できること(チルト・昇降機能があるもの)</li> </ul> <h4 id="ディスプレイ配置要件">ディスプレイ配置要件</h4> <p>私の職場ではアラートを表示させておく「監視・制御端末」、トラブルチケットを記入したりオンラインドキュメントを調べたりする「チケット端末」、各社員の個人端末を引き込む<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B7%A5%F3%A5%AF%A5%E9%A5%A4%A5%A2%A5%F3%A5%C8">シンクライアント</a>の計3台のPCをワンセットとして配置しています。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20170104/20170104233758.png" alt="f:id:miyahan:20170104233758p:plain" title="f:id:miyahan:20170104233758p:plain" class="hatena-fotolife" itemprop="image"></span></p> <p>普段は各セットにオペレーター1人が着席しており、アラートの監視をしつつ、普段の事務作業等をこなしています。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20170104/20170104233808.png" alt="f:id:miyahan:20170104233808p:plain" title="f:id:miyahan:20170104233808p:plain" class="hatena-fotolife" itemprop="image"></span></p> <p>障害対応時は作業のスピードアップやダブルチェックによる安全作業のため2人でペアを組みます。そして一人が Tera Term を使って<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%EB%A1%BC%A5%BF%A1%BC">ルーター</a>を操作をしつつ現地対応者へ電話で指示を出し、もう一人がチケットの記録や相方のサポートを行い対応を進めていきます。</p> <p>監視制御端末ではアラートリストや、Tera Term でのログ表示など縦に長いデータを見る場合が多いので画面を90度回転(ピボット)し縦長にして運用します。</p> <h3 id="ディスプレイの選定DELL-U2414H--U2415">ディスプレイの選定:<a class="keyword" href="http://d.hatena.ne.jp/keyword/DELL">DELL</a> U2414H / U2415</h3> <p>監視端末のディスプレイは高さ制限を満たしつつ広いディスプレイが欲しいということで <a class="keyword" href="http://d.hatena.ne.jp/keyword/DELL">DELL</a> U2415 (24インチ<a class="keyword" href="http://d.hatena.ne.jp/keyword/WUXGA">WUXGA</a>) の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C7%A5%E5%A5%A2%A5%EB%A5%C7%A5%A3%A5%B9%A5%D7%A5%EC%A5%A4">デュアルディスプレイ</a>構成にしました。またチケット端末はコストパフォーマンスに優れる <a class="keyword" href="http://d.hatena.ne.jp/keyword/DELL">DELL</a> U2414H (23インチ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D5%A5%EBHD">フルHD</a>)を選定しました。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20170105/20170105002421.jpg" alt="f:id:miyahan:20170105002421j:plain" title="f:id:miyahan:20170105002421j:plain" class="hatena-fotolife" itemprop="image"></span></p> <p>これらの機種の最大の特徴は薄いベゼルで、上と左右の3辺がフレームレスになっています。画面回転するときに一方を右90度回転、一方を左90度回転してフレームが薄い辺を合わせることで、上の写真のようにシームレスな<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C7%A5%E5%A5%A2%A5%EB%A5%C7%A5%A3%A5%B9%A5%D7%A5%EC%A5%A4">デュアルディスプレイ</a>環境を構築することができました。</p> <p>ディスプレイの検証・レビューで有名な <a href="http://www.tftcentral.co.uk/reviews/dell_u2414h.htm">TFT Central さんのレビュー記事</a> を見ると<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D5%A5%EA%A5%C3%A5%AB%A1%BC">フリッカー</a>が起きないことが確認でき、画面の均一性・応答速度・視野角も良好であったことも重要なポイントでした。</p> <p>実際に使ってみたところスリムなベゼルはカッコよく見えます。エッジの小さい<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C7%A5%E5%A5%A2%A5%EB%A5%C7%A5%A3%A5%B9%A5%D7%A5%EC%A5%A4">デュアルディスプレイ</a>環境も大変快適で、現場からも好評でした。</p> <hr /> <h3 id="さいごに">さいごに</h3> <p>今回の端末更改は当初、私の所属する監視チームではなく庶務を行うサポートチームが進めていたのですが、あまりにテキトーで業務形態を無視した検討を進めていたため、私が同僚に現環境の不満を聞いて回り、上記のような検討資料を作って殴り込みに行きそれまでの計画を白紙に戻させました。ドンパチ揉めたこともありましたが、その甲斐あって快適なオペレーション環境を手に入れることができ、監視チームの反応も上々です。</p> <p>やはりこういったものは、実際に業務する人・詳しい人が選ぶのが一番です。みなさんもぜひ総務まかせにせず、「強いパソコンほしい!」と声をあげて快適な環境をゲットしましょう!!</p> <p># とは言ったものの、私のデスクは会社の支給品がクソすぎるので、仕方なくディスプレイからマウスまで私物(自腹)だったりしますがw</p> miyahan Mac mini のディスク不調、SMCリセットで直る hatenablog://entry/10328749687200699591 2016-12-23T16:52:19+09:00 2017-07-29T21:10:16+09:00 狂うストレージ 先日、自宅サーバーにしている 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 : /… <h3>狂うストレージ</h3> <p>先日、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%BC%AB%C2%F0%A5%B5%A1%BC%A5%D0">自宅サーバ</a>ーにしている <a class="keyword" href="http://d.hatena.ne.jp/keyword/Mac%20mini">Mac mini</a> (Mid 2011) からアラートメールが届きました。</p> <pre class="code" data-lang="" data-unlink>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&amp;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)</pre> <p>バックアップ用に使っている外付けUSB HDDのアラートのようです。SMARTの中身を見てみると・・・</p> <pre class="code" data-lang="" data-unlink>Total Capacity : unknown Model : 7K8:/\6Θw`$(It6&amp;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 </pre> <p>機種名や<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D5%A5%A1%A1%BC%A5%E0%A5%A6%A5%A7%A5%A2">ファームウェア</a>バージョン情報は文字化けしているし、<strong>統計情報の attribute id も value もハチャメチャ</strong>です。完全に逝っちゃってますね。しかし、このHDDを別の<a class="keyword" href="http://d.hatena.ne.jp/keyword/Mac">Mac</a>に接続したところ、正常にSMARTを読み込めたのでHDDが壊れているわけではなさそうです。</p> <p>とりあえずマシンを再起動してみたのですが、<strong>なんとOSのシャットダウンに10分</strong>もかかりました。状況を確認していたところ、普段は10分程度で終わるはずのバックアップがある日を境に10時間以上かかるようになっていたことも判明。ディスクのパフォーマンスが低下している・・・?</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20161223/20161223163409.png" alt="f:id:miyahan:20161223163409p:plain" title="f:id:miyahan:20161223163409p:plain" class="hatena-fotolife" itemprop="image"></span></p> <p>システムディスク(Crucial MX200 <a class="keyword" href="http://d.hatena.ne.jp/keyword/SSD">SSD</a>) に対し<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D9%A5%F3%A5%C1%A5%DE%A1%BC%A5%AF">ベンチマーク</a>を取ってみたところ、ななんと<strong><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%EB%A1%BC%A5%D7%A5%C3%A5%C8">スループット</a>が数百KB/s</strong> に低下しています!</p> <p>内蔵<a class="keyword" href="http://d.hatena.ne.jp/keyword/SSD">SSD</a>と外付HDDが同時におかしくなるということは、OS か <a class="keyword" href="http://d.hatena.ne.jp/keyword/Mac%20mini">Mac mini</a> 本体のハードウェア障害が疑われます。ローレイヤーな話なので SMC (System Management Controller) も怪しいところ。</p> <h3>SMCリセット</h3> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fsupport.apple.com%2Fja-jp%2FHT201295" title="Mac の SMC (システム管理コントローラ) をリセットする" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;"></iframe><cite class="hatena-citation"><a href="https://support.apple.com/ja-jp/HT201295">support.apple.com</a></cite></p> <p>というわけでまずはSMCリセットから。<a class="keyword" href="http://d.hatena.ne.jp/keyword/Mac%20mini">Mac mini</a> 本体の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C5%C5%B8%BB%A5%B1%A1%BC%A5%D6%A5%EB">電源ケーブル</a>を抜き、数十秒放置すればリセットされます。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20161223/20161223163952.png" alt="f:id:miyahan:20161223163952p:plain" title="f:id:miyahan:20161223163952p:plain" class="hatena-fotolife" itemprop="image"></span></p> <p>おお、システムディスクのパフォーマンス低下直ったー!</p> <pre class="code" data-lang="" data-unlink>Total Capacity : 1.0 TB (1,000,204,886,016 Bytes) Model Family : Toshiba 2.5&#34; 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 - </pre> <p>外付けHDDの SMART も直ったー!</p> <p>そんなわけで SMC て結構多種多様なトラブルに関わってくるんだなーと思い知った案件でした。めでたしめでたし。</p> miyahan Grafana & Graphite でRADIUSのログを可視化してみた 開発編 hatenablog://entry/10328749687193993912 2016-12-06T00:00:00+09:00 2018-09-02T13:44:48+09:00 とある通信会社の下請けでネットワークの監視業務をしています。サービスの異常を素早く一目で把握できるよう、Grafana / Graphite を使ってRADIUSサーバーのログを可視化するツールを作りました。 <p>このエントリは「Grafana &amp; Graphite で<a class="keyword" href="http://d.hatena.ne.jp/keyword/RADIUS">RADIUS</a>のログを可視化してみた 概要編」の続きとなります。最初のエントリをご覧になってからお読みください。</p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fmiyalog.hatenablog.jp%2Fentry%2Fradius_graphite_grafana_1" title="Grafana &amp; Graphite でRADIUSのログを可視化してみた 概要編 - miyalog" class="embed-card embed-blogcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;"></iframe><cite class="hatena-citation"><a href="https://miyalog.hatenablog.jp/entry/radius_graphite_grafana_1">miyalog.hatenablog.jp</a></cite></p> <p>さてこちらが本編。<a class="keyword" href="http://d.hatena.ne.jp/keyword/RADIUS">RADIUS</a>認証ログ可視化ツール Radtail の開発にあたり、苦労した点、工夫した点を語らせて頂きます。</p> <ul class="table-of-contents"> <li><a href="#tail--f-でログあつめ">tail -f でログあつめ</a></li> <li><a href="#マルチプロセス導入への道のり">マルチプロセス導入への道のり</a><ul> <li><a href="#Graphite-データ上書き問題">Graphite データ上書き問題</a></li> <li><a href="#そしてマルチプロセスへ">そしてマルチプロセスへ</a></li> </ul> </li> <li><a href="#defaultdict-で簡単集計">defaultdict で簡単集計</a></li> <li><a href="#パフォーマンスチューニング">パフォーマンスチューニング</a><ul> <li><a href="#ベンチマークで現状把握">ベンチマークで現状把握</a></li> <li><a href="#プロファイリングで原因特定">プロファイリングで原因特定</a></li> <li><a href="#datetimestrptime-対策">datetime.strptime 対策</a></li> <li><a href="#multiprocessingQueue-対策">multiprocessing.Queue 対策</a></li> <li><a href="#チューニングの効果">チューニングの効果</a></li> </ul> </li> <li><a href="#Graphite-書き込み間に合わない問題">Graphite 書き込み間に合わない問題</a></li> <li><a href="#おわりに">おわりに</a></li> </ul> <h3 id="tail--f-でログあつめ">tail -f でログあつめ</h3> <p>いいえ、<a class="keyword" href="http://d.hatena.ne.jp/keyword/Cisco">Cisco</a> <a class="keyword" href="http://d.hatena.ne.jp/keyword/NSO">NSO</a> じゃないです。</p> <p>何はともあれ <a class="keyword" href="http://d.hatena.ne.jp/keyword/RADIUS">RADIUS</a>サーバーからログを取得できなければ話は始まりません。ログの収集といえば、Fluentd や Logstash 等の定番<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AA%A1%BC%A5%D7%A5%F3%A5%BD%A1%BC%A5%B9">オープンソース</a>ソフトウェアを使うのがセオリーだとは思いますが、下請け作業員がサーバーに入ることすらはばかられるのに、エージェントをインストールするなど天地がひっくり返っても許されません。</p> <pre class="code lang-python" data-lang="python" data-unlink><span class="synPreProc">import</span> pexpect <span class="synStatement">with</span> pexpect.spawn(<span class="synConstant">'ssh -o &quot;StrictHostKeyChecking=no&quot; foo@10.10.10.10'</span>, timeout=<span class="synConstant">10</span>) <span class="synStatement">as</span> exp: exp.expect(<span class="synConstant">'Password:'</span>) exp.sendline(<span class="synConstant">'admin123'</span>) exp.expect(<span class="synConstant">'\$'</span>) exp.sendline(<span class="synConstant">'tail -F /var/log/radius/accounting.log'</span>) <span class="synStatement">while</span> <span class="synIdentifier">True</span>: exp.expect(<span class="synConstant">'</span><span class="synSpecial">\r\n</span><span class="synConstant">'</span>) result = exp.before.decode(<span class="synConstant">'euc-jp'</span>) </pre> <p>ただ、なんとかサーバーに<a class="keyword" href="http://d.hatena.ne.jp/keyword/SSH">SSH</a>してログを覗く許可だけはもらえたので、「人が<a class="keyword" href="http://d.hatena.ne.jp/keyword/SSH">SSH</a>していいなら、ツールが<a class="keyword" href="http://d.hatena.ne.jp/keyword/SSH">SSH</a>してもいいだろう」という拡大解釈のもと、サーバー上で <code>tail -f</code> もしくは <code>tail -F</code> コマンドを叩いて、大量に吐き出され続けるログを expect で1行ずつ取り出して処理するようにしました。ログインも当然ながら私の公開鍵を登録することもできないので、expect で対話型パスワード認証を行います。<strong>まったく、expect は最高だぜ!!</strong>。あとは取り出したログをよしなにパース&整形してやればログの収集・解釈が完了。ちなみに、Radtail というツール名はこの tail を使うことに由来しています。</p> <p>Tips: <code>tail -f</code> ではなく <code>tail -F</code> オプションを使うことで、ログローテーションされて開いていたファイルがなくなっても、自動でファイルを再オープンして tail を再開してくれます。ただ <a class="keyword" href="http://d.hatena.ne.jp/keyword/Solaris">Solaris</a> 10 を搭載した古いサーバーでは対応していなかったため、一定時間ログが流れてこなかったら開き直すという処理をいれてお茶を濁しました。</p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fqiita.com%2Fsakito%2Fitems%2F7f65e16f10b3d754f307" title="tailコマンドのオプション「f」と「F」 - Qiita" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;"></iframe></p> <hr /> <h3 id="マルチプロセス導入への道のり">マルチプロセス導入への道のり</h3> <h4 id="Graphite-データ上書き問題">Graphite データ上書き問題</h4> <p>開発当初、<a class="keyword" href="http://d.hatena.ne.jp/keyword/RADIUS">RADIUS</a>サーバーごとにツールを起動し、それぞれでログを Graphite に送信していたのですが、記録されたデータの値が実際より大幅に少ないという不具合が起きました。調べたところ数ヶ月前の設備更改の際に<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%ED%A1%BC%A5%C9%A5%D0%A5%E9%A5%F3%A5%B5%A1%BC">ロードバランサー</a>を導入したそうで、同一LACのリク<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A8%A5%B9">エス</a>トが複数の<a class="keyword" href="http://d.hatena.ne.jp/keyword/RADIUS">RADIUS</a>サーバーに振り分けらた結果、同じメトリック・同じタイムスタンプのデータが発生します。本来はそれを合算すべきなのですが、それぞれのツールがデータをそのまま Graphite に送信したことでデータが上書きされ、<strong>最後に処理したデータのみが残るという後勝ち現象が起きていた</strong>のでした。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20161104/20161104001347.png" alt="f:id:miyahan:20161104001347p:plain" title="f:id:miyahan:20161104001347p:plain" class="hatena-fotolife" itemprop="image"></span>本来は合計 600 なのだが、最後に送信された 100 で記録されてしまう</p> <p>例えば<a class="keyword" href="http://d.hatena.ne.jp/keyword/MySQL">MySQL</a>でいうところの、<code>INSERT INTO hoge SET atr='%s', ts=%s, val=%s ON DUPLICATE KEY UPDATE val=val+VALUES(val);</code> みたいなことをやらせたく、こんな設定を入れてみましたが状況は変わりませんでした。</p> <pre class="code" data-lang="" data-unlink># /etc/carbon/storage-aggregation.conf [radtail] pattern = ^radiuslog\. xFilesFactor = 0 aggregationMethod = sum</pre> <p>どうやら storage-aggregation.conf は、複数のリテンションを設定している場合において、データを丸める方法を指定するファイルであって、受信したデータの集計方法を変えるものではなかったみたいです。アメリカ語から目を背けてきたツケががが。というわけで、<strong>Graphite/Carbon に集計機能はありません</strong>。つまり自前で集計機能を作る必要が出てきました。</p> <p>もはや Graphite でそれやる?という話になってきましたが・・・</p> <h4 id="そしてマルチプロセスへ">そしてマルチプロセスへ</h4> <p>真っ先に思いつくのはマルチスレッド化してGraphiteに送るデータのバッファを共有することですが、実は <strong><a class="keyword" href="http://d.hatena.ne.jp/keyword/Python">Python</a> のマルチスレッドは <a href="https://ja.wikipedia.org/wiki/%E3%82%B0%E3%83%AD%E3%83%BC%E3%83%90%E3%83%AB%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%97%E3%83%AA%E3%82%BF%E3%83%AD%E3%83%83%E3%82%AF">GIL(Global Interpreter Lock)</a> という制約によってプロセッサ数に対してスケールしません</strong>。ちなみに <a class="keyword" href="http://d.hatena.ne.jp/keyword/Ruby">Ruby</a> にも グローバル<a class="keyword" href="http://d.hatena.ne.jp/keyword/VM">VM</a>ロック という同様の仕組みがあるそうです。しかしCPU1コアではパワーがまるで足りないため、今回使うことはできませんでした。</p> <p>そこでマルチコアCPUの恩恵を受けられるマルチプロセスを使うことにしました。<a class="keyword" href="http://d.hatena.ne.jp/keyword/Python">Python</a> の multiprocessing モジュールにはプロセス間でデータを共有できる「共有メモリ」や「サーバープロセス」という機能があるのですが、ロックによりパフォーマンスが出しにくいことや、配列などのミュータブルなオブジェクトを扱うのが難しいため不採用。かわりにプロセス間通信機能の <a href="https://docs.python.jp/2/library/multiprocessing.html#exchanging-objects-between-processes">multiprocessing.Queue</a> を使うことにしました。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20161104/20161104055933.png" alt="f:id:miyahan:20161104055933p:plain" title="f:id:miyahan:20161104055933p:plain" class="hatena-fotolife" itemprop="image"></span></p> <p>ログを収集・解釈する "Collector" プロセスをサーバー台数分、ログを集計・記録する "Aggregator" プロセスを1つ生成し、Collector から Aggregator へはキューを使ってデータを渡すようにしました。</p> <p>各 Collect プロセスは、Aggregate プロセスへ好きなタイミングでどんどんメッセージを送信していきます。メッセージは Queue に格納されていき、Aggregator はキューから<a class="keyword" href="http://d.hatena.ne.jp/keyword/FIFO">FIFO</a>でメッセージを取り出し処理していきます。このようにそれぞれのプロセスが非同期に動作することでCPUパワーを余すことなく活用できるようになりました。</p> <p>それにしても multiprocessing モジュールを呼ぶだけで並列処理が簡単に書けるなんて、<a class="keyword" href="http://d.hatena.ne.jp/keyword/PHP">PHP</a> しかわからない自分は魔法にしか見えません。軽いカルチャーショックです。。。え、普通?</p> <hr /> <h3 id="defaultdict-で簡単集計">defaultdict で簡単集計</h3> <p>各 Collector から送られてくるデータの集計は、タイムスタンプ・<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A2%A5%C8%A5%EA%A5%D3%A5%E5%A1%BC%A5%C8">アトリビュート</a>で階層化された辞書(<a class="keyword" href="http://d.hatena.ne.jp/keyword/%CF%A2%C1%DB%C7%DB%CE%F3">連想配列</a>のようなもの)をバッファとして用意し、そこに値を代入したり加算していくようにしました。具体的にはこんな感じ</p> <pre class="code lang-python" data-lang="python" data-unlink>buf[デートタイム][LACホスト名][LACポート名][イベントタイプ] = イベント数 </pre> <p>で、当初はいちいちキーの存在をチェックし初期化していたのですが、<a href="https://docs.python.jp/3.5/library/collections.html#collections.defaultdict">collections.defaultdict</a> という自動で初期化を行ってくれる辞書モジュールを見つけ、コードを書き直したところデータの追加が1行で済むようになり、実行速度も3割ほど高速になりました。テキトーに<a class="keyword" href="http://d.hatena.ne.jp/keyword/%CF%A2%C1%DB%C7%DB%CE%F3">連想配列</a>を使うことに慣れている私のようなゆるふわPHPerにはありがたいモジュールですね。</p> <pre class="code lang-python" data-lang="python" data-unlink><span class="synComment"># Before : キーの存在を確認して初期化</span> buf = {} <span class="synStatement">if</span> <span class="synConstant">'2017/1/1 00:00:00'</span> <span class="synStatement">not</span> <span class="synStatement">in</span> buf: buf[<span class="synConstant">'2017/1/1 00:00:00'</span>] = {} <span class="synStatement">if</span> <span class="synConstant">'ootemachi-bas01'</span> <span class="synStatement">not</span> <span class="synStatement">in</span> buf[<span class="synConstant">'2017/1/1 00:00:00'</span>]: buf[<span class="synConstant">'2017/1/1 00:00:00'</span>][<span class="synConstant">'ootemachi-bas01'</span>] = {} <span class="synStatement">if</span> <span class="synConstant">'access-accept'</span> <span class="synStatement">in</span> buf[<span class="synConstant">'2017/1/1 00:00:00'</span>][<span class="synConstant">'ootemachi-bas01'</span>]: buf[<span class="synConstant">'2017/1/1 00:00:00'</span>][<span class="synConstant">'ootemachi-bas01'</span>][<span class="synConstant">'slot1'</span>][<span class="synConstant">'access-accept'</span>] += <span class="synConstant">10</span> <span class="synStatement">else</span>: buf[<span class="synConstant">'2017/1/1 00:00:00'</span>][<span class="synConstant">'ootemachi-bas01'</span>][<span class="synConstant">'slot1'</span>][<span class="synConstant">'access-accept'</span>] = <span class="synConstant">10</span> </pre> <pre class="code lang-python" data-lang="python" data-unlink><span class="synComment"># After : defaultdict を使って自動初期化</span> <span class="synPreProc">from</span> collections <span class="synPreProc">import</span> defaultdict buf = defaultdict(<span class="synStatement">lambda</span>: defaultdict(<span class="synStatement">lambda</span>: defaultdict(<span class="synStatement">lambda</span>: defaultdict(<span class="synIdentifier">int</span>)))) buf[<span class="synConstant">'2017/1/1 00:00:00'</span>][<span class="synConstant">'ootemachi-bas01'</span>][<span class="synConstant">'slot1'</span>][<span class="synConstant">'access-accept'</span>] += <span class="synConstant">10</span> </pre> <hr /> <h3 id="パフォーマンスチューニング">パフォーマンスチューニング</h3> <p>四苦八苦しながらどうにか動くまでにこぎ着けたものの、今度はパフォーマンスの問題に直面しました。プロトタイプはCPU使用率が Collect プロセスで 30〜60%、Aggregate プロセスで 60〜100% と高く、ログがバーストした際に集計処理がおいつかずキューが溢れてしまう問題が発生しました。</p> <p>「<strong>推測するな、計測せよ</strong>」という格言があるように、私もそれに倣うことにしました。</p> <h4 id="ベンチマークで現状把握"><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D9%A5%F3%A5%C1%A5%DE%A1%BC%A5%AF">ベンチマーク</a>で現状把握</h4> <p>まず現状把握とチューニングの効果確認のために、100万行のダミーデータを用意し<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D9%A5%F3%A5%C1%A5%DE%A1%BC%A5%AF">ベンチマーク</a><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%AF%A5%EA%A5%D7%A5%C8">スクリプト</a>を書いて実行してみました。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20161116/20161116173013.png" alt="f:id:miyahan:20161116173013p:plain" title="f:id:miyahan:20161116173013p:plain" class="hatena-fotolife" itemprop="image"></span></p> <p>すでに問題が見えてきましたね。これから試行錯誤しながらこのタイムを縮めることを目指していきます。</p> <h4 id="プロファイリングで原因特定">プロファイリングで原因特定</h4> <p>次に問題箇所の特定のため、プロファイリングを行います。<a class="keyword" href="http://d.hatena.ne.jp/keyword/Python">Python</a> には標準で <a href="https://docs.python.jp/3.3/library/profile.html">cProfile</a> というプロファイリングライブラリがバンドルされています。今回は、さらにそれをグラフ化する <a href="http://pycallgraph.readthedocs.io/en/master/">Python Call Graph (pycallgraph)</a> というツールを使ってみました。なおプロファイリングにあたり下記サイトを参考にさせていただきました。</p> <p><iframe src="https://hatenablog-parts.com/embed?url=http%3A%2F%2Fpostd.cc%2Fprofiling-in-python%2F" title="Pythonにおけるプロファイリング ― コードの高速化のために | POSTD" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;"></iframe></p> <p><iframe src="https://hatenablog-parts.com/embed?url=http%3A%2F%2Fshkh.hatenablog.com%2Fentry%2F2013%2F08%2F16%2F221205" title="Pythonコードのプロファイリング - shkh&#39;s blog" class="embed-card embed-blogcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;"></iframe></p> <p>なお、<a class="keyword" href="http://d.hatena.ne.jp/keyword/Python">Python</a> Call Graph の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B3%A5%DE%A5%F3%A5%C9%A5%E9%A5%A4%A5%F3">コマンドライン</a>は、出力形式を指定しても反映されない<a href="https://github.com/gak/pycallgraph/issues/116">バグ</a>があるらしく、今回は <a class="keyword" href="http://d.hatena.ne.jp/keyword/Python">Python</a> <a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%AF%A5%EA%A5%D7%A5%C8">スクリプト</a>内から呼び出すようにしました。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20161116/20161116175615.png" alt="f:id:miyahan:20161116175615p:plain" title="f:id:miyahan:20161116175615p:plain" class="hatena-fotolife" itemprop="image"></span><a class="keyword" href="http://d.hatena.ne.jp/keyword/Python">Python</a> Call Graphの実行結果 / オリジナルサイズの<a href="https://miyahan.com/miyalog_content/radtail_pycallgraph_before.pdf">PDFはコチラ</a></p> <p>おお、なんかカッコイイ・・・!<a class="keyword" href="http://d.hatena.ne.jp/keyword/Python">Python</a> Call Graph は、呼ばれたモジュール・メソッドの関係、実行された回数・時間を可視化してくれます。また時間がかかっているメソッドを色づけしてくれるため、問題箇所を一目で把握することができます。グラフをみると datetime および multiprocessing モジュールで多くの時間が費やされているようです。</p> <p>さらに問題となっているコードを特定するため、<a href="https://github.com/rkern/line_profiler">line_profiler</a> というツールを使ってみます。すると2カ所、処理に時間ががかっているコードを発見しました。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20161112/20161112020142.png" alt="f:id:miyahan:20161112020142p:plain" title="f:id:miyahan:20161112020142p:plain" class="hatena-fotolife" itemprop="image"></span>1カ所目:datetime.strptime() でログの日時文字列をパースしているところ</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20161112/20161112020134.png" alt="f:id:miyahan:20161112020134p:plain" title="f:id:miyahan:20161112020134p:plain" class="hatena-fotolife" itemprop="image"></span>2カ所目:multiprocessing.Queue.get() でキューを取り出しているところ</p> <h4 id="datetimestrptime-対策">datetime.strptime 対策</h4> <p>まず1カ所目、datetime.strptime が遅い問題は、同メソッドの使用をやめ、下記のように自分でスプリットしてから datetime に渡すように書き換えたところ4倍以上高速になりました!</p> <pre class="code lang-python" data-lang="python" data-unlink><span class="synComment"># Before</span> logtime = datetime.datetime.strptime(row[<span class="synConstant">0</span>], <span class="synConstant">&quot;%Y%m%d%H%M%S.%f&quot;</span>) <span class="synComment"># After</span> logtime = datetime( year=<span class="synIdentifier">int</span>(row[<span class="synConstant">0</span>][<span class="synConstant">0</span>:<span class="synConstant">4</span>]), month=<span class="synIdentifier">int</span>(row[<span class="synConstant">0</span>][<span class="synConstant">4</span>:<span class="synConstant">6</span>]), day=<span class="synIdentifier">int</span>(row[<span class="synConstant">0</span>][<span class="synConstant">6</span>:<span class="synConstant">8</span>]), hour=<span class="synIdentifier">int</span>(row[<span class="synConstant">0</span>][<span class="synConstant">8</span>:<span class="synConstant">10</span>]), minute=<span class="synIdentifier">int</span>(row[<span class="synConstant">0</span>][<span class="synConstant">10</span>:<span class="synConstant">12</span>]), second=<span class="synIdentifier">int</span>(row[<span class="synConstant">0</span>][<span class="synConstant">12</span>:<span class="synConstant">14</span>]) ) </pre> <p>なお本件は次のエントリで詳しく紹介しています。ぜひ併せてご覧ください。</p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fmiyalog.hatenablog.jp%2Fentry%2Fpython_strptime" title="Python の datetime.strptime がすんごく遅い件 - miyalog" class="embed-card embed-blogcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;"></iframe></p> <h4 id="multiprocessingQueue-対策">multiprocessing.Queue 対策</h4> <p>次に2カ所目の multiprocessing.Queue.get() に時間がかかっている問題は完全に私の設計ミスです。よくよく考えてみればプロセス間通信(かつ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C7%D3%C2%BE%C0%A9%B8%E6">排他制御</a>付き)のコストが高いのは当たり前の話で、それを毎秒1万回もやっていたらそりゃ重いわけです。</p> <p>そこでメッセージをリスト(配列)に格納していき、それを1秒ごとプロセス間で交換するように仕様変更したところCPU使用率が軽減できました。</p> <h4 id="チューニングの効果">チューニングの効果</h4> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20161104/20161104060843.png" alt="f:id:miyahan:20161104060843p:plain" title="f:id:miyahan:20161104060843p:plain" class="hatena-fotolife" itemprop="image"></span></p> <p>まずは<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D9%A5%F3%A5%C1%A5%DE%A1%BC%A5%AF">ベンチマーク</a>の結果から。最初は28秒かかっていた処理が、8秒と3.5倍以上の高速化に成功しました!</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20161112/20161112022223.png" alt="f:id:miyahan:20161112022223p:plain" title="f:id:miyahan:20161112022223p:plain" class="hatena-fotolife" itemprop="image"></span> CPU使用率(最適化前)</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20161112/20161112022227.png" alt="f:id:miyahan:20161112022227p:plain" title="f:id:miyahan:20161112022227p:plain" class="hatena-fotolife" itemprop="image"></span> CPU使用率(最適化後)</p> <p>また実際のツール動作時のCPU使用率もご覧の通り激減しています。たびたび100%に張り付いていた Aggregate プロセスは 20〜30% に落ち、処理が追いつかなくなる問題は解消しました。サーバーリソース的にもにっこり。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20161129/20161129014201.png" alt="f:id:miyahan:20161129014201p:plain" title="f:id:miyahan:20161129014201p:plain" class="hatena-fotolife" itemprop="image"></span>オリジナルサイズの<a href="https://miyahan.com/miyalog_content/radtail_pycallgraph_after.pdf">PDFはコチラ</a></p> <p>ちなみに、最適化したソースに対し PyCallGraph を実行するとこうなりました。重たい strptime の使用をやめたことで呼び出されるモジュールが激減していますね。</p> <hr /> <h3 id="Graphite-書き込み間に合わない問題">Graphite 書き込み間に合わない問題</h3> <p>ツールがある程度動くようになり会社の本番サーバー(<a class="keyword" href="http://d.hatena.ne.jp/keyword/VMware">VMware</a> vSphere Hypervisor / CentOS6)にデプロイしてみたところ、ツールを起動してから10分程度経つとデータが記録されなくなる不具合が起きました。結論だけいうと、<strong>本番サーバーのストレージ (1krpm <a class="keyword" href="http://d.hatena.ne.jp/keyword/SAS">SAS</a> HDD x 2 RAID1) のI/O性能がヘボすぎてディスクフラッシュが追いつかない</strong>というものでした。(開発に使っていたPCは<a class="keyword" href="http://d.hatena.ne.jp/keyword/SSD">SSD</a>なので問題にならなかった)</p> <p>当初はログを1秒単位で集計(=マイクロ秒を切り捨て)しており、1万メトリック/秒 くらいの<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C8%A5%E9%A5%D5%A5%A3%A5%C3%A5%AF">トラフィック</a>がありました。そこで集計単位を10秒に伸ばしたところ、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C8%A5%E9%A5%D5%A5%A3%A5%C3%A5%AF">トラフィック</a>が 5000メトリック/秒に減少。しかしそれでもギリギリどうにかついて行っている状態で、ちょっとでもバックグラウンド処理(ログローテーション、メンテナンス<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%AF%A5%EA%A5%D7%A5%C8">スクリプト</a>の実行等)が走ったり、他の<a class="keyword" href="http://d.hatena.ne.jp/keyword/VM">VM</a>が活動し出すとフラッシュが全く追いつかず、どんどんバッファが貯まっていってしまいます。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20161116/20161116180949.png" alt="f:id:miyahan:20161116180949p:plain" title="f:id:miyahan:20161116180949p:plain" class="hatena-fotolife" itemprop="image"></span> 図:本番サーバー 調子よいとき</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20161116/20161116181011.png" alt="f:id:miyahan:20161116181011p:plain" title="f:id:miyahan:20161116181011p:plain" class="hatena-fotolife" itemprop="image"></span> 図:本番サーバー 調子わるいとき</p> <p>carbon-cache の設定をいじってチューニングしようとしたものの、全く効果はありませんでした。詳しい検証内容は次のエントリでまとめています。併せてご覧ください。</p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fmiyalog.hatenablog.jp%2Fentry%2FGraphite_tuning" title="Graphite のチューニングには札束しかなかった話 - miyalog" class="embed-card embed-blogcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;"></iframe></p> <p>結局サーバーのスペック不足はどうしようもなく、ツールの実行は本番サーバー、データの記録(carbon-cache)はそこらへんの作業用パソコンつなげた USB <a class="keyword" href="http://d.hatena.ne.jp/keyword/SSD">SSD</a>という暫定運用をしています。つまりだれかがそのPCを再起動したりスリープさせるとツールが止まるということです。(´- ω -`)</p> <hr /> <h3 id="おわりに">おわりに</h3> <p>軽い気持ちで始めたツール開発。しかしふたを開けてみれば<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D5%A5%EC%A1%BC%A5%E0%A5%EF%A1%BC%A5%AF">フレームワーク</a>すら使えないゆるふわPHPerにはあまりに過剰な挑戦でした。やりたいことはログを整形してDBに記録するだけとシンプルなのに、いざ開発を始めると多くの問題や課題が出てきて、そのたびに1日中ググったり、風呂や布団の中で悶々とシステム設計について脳内会議を開いたり、ときに teratail などの質問サイトにもお世話になりました。</p> <p>初めての <a class="keyword" href="http://d.hatena.ne.jp/keyword/Python">Python</a> モジュール/クラス使用、初めてのリアルタイムデータ処理、初めてのGBクラスの大量データ処理、初めての並列処理/マルチプロセス設計、初めてのデーモン開発・・・</p> <p>でも、おかげさまで実用的なツールができあがりましたし、自身のスキルもかなり向上しました。そしてなにより</p> <p>ツール作るの楽しい ✌('ω'✌ )三✌('ω')✌三( ✌'ω')✌</p> <p>これですな。</p> <hr /> <p>今回ツールを作るうえで、</p> <ul> <li>Graphite のデータ活用法(関数の使いこなし、<a class="keyword" href="http://d.hatena.ne.jp/keyword/API">API</a>を使った外部ツールとの連携等)</li> <li>統計データから異常状態・<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C6%C3%B0%DB%C5%C0">特異点</a>を見つける方法</li> </ul> <p>といった領域のスキル・ノウハウが足りませんでした。Advent Calender をはじめ、NetOpsCoding の定期イベントやSlack、ML 等で知見をシェアいただけると大変助かります。よろしくお願いします。</p> miyahan Grafana & Graphite でRADIUSのログを可視化してみた 概要編 hatenablog://entry/10328749687192867595 2016-12-06T00:00:00+09:00 2018-09-02T13:44:48+09:00 とある通信会社の下請けでネットワークの監視業務をしています。サービスの異常を素早く一目で把握できるよう、Grafana / Graphite を使ってRADIUSサーバーのログを可視化するツールを作りました。 <p><a href="https://qiita.com/advent-calendar/2016/netopscoding">NetOpsCoding Advent Calendar 2016 @ Qiita</a> 12/6 のエントリです。サービスの異常を素早く一目で把握できるよう、<a class="keyword" href="http://d.hatena.ne.jp/keyword/RADIUS">RADIUS</a>サーバーのログを可視化するツールを作ったお話をします。</p> <h3>きっかけ</h3> <p>おはようございます!(午後6時) とある通信会社の委託でネットワークの監視業務をしている夜勤作業員です。(エンジニアじゃないよ)</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20161104/20161104004823.png" alt="f:id:miyahan:20161104004823p:plain" title="f:id:miyahan:20161104004823p:plain" class="hatena-fotolife" itemprop="image"></span></p> <p>具体的にはこんな感じの<a class="keyword" href="http://d.hatena.ne.jp/keyword/Cisco">Cisco</a>の古い教科書によく載っているようなインターネットには直接繋がっていないネットワーク(いわゆる閉鎖網)を見ているのですが、サービスの正常性を確認する方法として、各<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%EB%A1%BC%A5%BF%A1%BC">ルーター</a>に<a class="keyword" href="http://d.hatena.ne.jp/keyword/Telnet">Telnet</a>し <code>show pppoe session</code> といったコマンドを叩いて、お客様のPPPoEセッションやLAC〜LNS間の<a class="keyword" href="http://d.hatena.ne.jp/keyword/L2TP">L2TP</a>トンネルが確立しているかをチェックします。ただこの作業は、</p> <ul> <li>障害の影響が広いときに何十台ものLAC/LNSを確認するのが辛い</li> <li>機種によってはCPUが弱く、コマンドの結果が表示されるまで数分待たされて辛い</li> <li>コマンドではその時点の状態しか確認できず、切れたセッションなどが見えず辛い</li> <li>目<a class="keyword" href="http://d.hatena.ne.jp/keyword/grep">grep</a>辛い、というか無理</li> </ul> <p>などなど多くの難点を抱えており、<strong>確認作業が大幅に遅れたり、見落としによるヒューマンエラーを起こしお客様からクレームを受ける</strong>など問題が山積みでした。</p> <p>過去に<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%EB%A1%BC%A5%BF%A1%BC">ルーター</a>に自動でログインしコマンドを叩き、結果をいい感じにグラフィカルに表示するWebアプリを作ってそれなりの効果があったのですが、大きな障害では結局ツールをルータの台数分実行しなければいけなかったり、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%EB%A1%BC%A5%BF%A1%BC">ルーター</a>の<a class="keyword" href="http://d.hatena.ne.jp/keyword/CUI">CUI</a>が遅い問題は如何ともし難く即時性に欠けるなど課題が残っていました。</p> <p>そこで<a class="keyword" href="http://d.hatena.ne.jp/keyword/RADIUS">RADIUS</a>サーバーの認証ログ・接続ログを使えないか?思い立ち、サービスの異常を素早く一目で把握すべく、ログを可視化するツール、名付けて「Radtail」(ラドテイル)を作ってみました。</p> <hr /> <h3>Radtail 概要</h3> <p>ところで、先日行われた <a href="https://atnd.org/events/78025">NetOpsCoding#3</a> で、日本<a class="keyword" href="http://d.hatena.ne.jp/keyword/Microsoft">Microsoft</a> 北島さんの発表、Monitoring Intelligence に感銘を受け、それからというもの Grafana + Graphite をいじくり回しています。</p> <p><iframe src="https://www.slideshare.net/slideshow/embed_code/key/Ey1fO1JeIgIxJ2" width="427" height="356" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC; border-width:1px; margin-bottom:5px; max-width: 100%;" allowfullscreen> </iframe> <div style="margin-bottom:5px"> <strong> <a href="https://www.slideshare.net/netopscoding/monitoring-intelligence" title="Monitoring Intelligence" target="_blank">Monitoring Intelligence</a> </strong> from <strong><a href="https://www.slideshare.net/netopscoding" target="_blank">netopscoding</a></strong> </div><cite class="hatena-citation"><a href="https://www.slideshare.net/netopscoding/monitoring-intelligence">www.slideshare.net</a></cite></p> <p>そんなわけで今回、データの収集・解析を自作の <a class="keyword" href="http://d.hatena.ne.jp/keyword/Python">Python</a> <a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%AF%A5%EA%A5%D7%A5%C8">スクリプト</a>で行いつつ、データの蓄積・描写にここぞとばかりと <a href="https://graphiteapp.org/">Graphite</a>・<a href="https://grafana.org/">Grafana</a> を採用しました。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20161116/20161116185907.png" alt="f:id:miyahan:20161116185907p:plain" title="f:id:miyahan:20161116185907p:plain" class="hatena-fotolife" itemprop="image"></span>Radtail システム構成図</p> <p>本ツールはマルチプロセス構成になっており、親プロセスである <strong>Control process</strong>、ログを収集する <strong>Collect process</strong> (サーバー台数分起動)、ログを集約・集計し Graphite に送信する <strong>Aggregate process</strong> が動作しています。</p> <p>おおまかな流れは次の通りです</p> <ol> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/RADIUS">RADIUS</a>サーバーに<a class="keyword" href="http://d.hatena.ne.jp/keyword/SSH">SSH</a>し、<code>tail -F</code> コマンドでログをリアルタイムに出力させる</li> <li>出力されたログをパースし、さらに<a class="keyword" href="http://d.hatena.ne.jp/keyword/IP%A5%A2%A5%C9%A5%EC%A5%B9">IPアドレス</a>の逆引き等を行いデータを補完する</li> <li>データを Aggregate process のキューへ送信する</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AD%A5%E5%A1%BC%A5%D0">キューバ</a>ッファからデータを取り出し集計する</li> <li>10秒ごとにデータを Graphite に送信する</li> </ol> <p>なおツールは <a href="supervisord">Supervisord</a> を使ってデーモン化しています。</p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fqiita.com%2Fyushin%2Fitems%2F15f4f90c5663710dbd56" title="Supervisorで簡単にデーモン化 - Qiita" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;"></iframe></p> <p>その結果を Grafana で描写させるとこうなります。いまのところ認証ログ(<a class="keyword" href="http://d.hatena.ne.jp/keyword/Access">Access</a> Accept / <a class="keyword" href="http://d.hatena.ne.jp/keyword/Reject">Reject</a>)および、接続ログ(Accounting Start / Stop)を取り扱っています。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20161104/20161104002147.png" alt="f:id:miyahan:20161104002147p:plain" title="f:id:miyahan:20161104002147p:plain" class="hatena-fotolife" itemprop="image"></span></p> <p>いや~もう、こんなかっちょいいグラフが出るだけで既に大満足です。</p> <p><blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">carbon-cache のチューニング完了。分解能を1秒から10秒にして負荷を下げた。<br>というわけで、<a class="keyword" href="http://d.hatena.ne.jp/keyword/RADIUS">RADIUS</a>サーバからログを tail -F で読み込んで、エンドユーザーの利用状況をリアルタイムに把握できるツール完成!!! <a href="https://twitter.com/hashtag/Grafana?src=hash&amp;ref_src=twsrc%5Etfw">#Grafana</a> <a href="https://twitter.com/hashtag/Graphite?src=hash&amp;ref_src=twsrc%5Etfw">#Graphite</a> <a href="https://t.co/HMHHXiPj1e">pic.twitter.com/HMHHXiPj1e</a></p>&mdash; Miyahan (@miyahancom) <a href="https://twitter.com/miyahancom/status/779034864276246528?ref_src=twsrc%5Etfw">2016年9月22日</a></blockquote><script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script></p> <hr /> <h3>サービス障害の見え方</h3> <p>ではこのツールでサービス障害はどのように見えるのでしょうか</p> <h4>LAGサイレント故障</h4> <p>LAC 〜 配下のL2スイッチ間は ACT - <a class="keyword" href="http://d.hatena.ne.jp/keyword/SBY">SBY</a> モードのリンクアグリゲーションで構成しており、障害検出時に <a class="keyword" href="http://d.hatena.ne.jp/keyword/SBY">SBY</a> 側に切り替わるようになっています。しかしログやコマンド上では正常に見えるのに、実はフレーム転送できていないというサイレント故障が起きることがまれによくあります。この事象が ACT 側で起きると、全てのパケットが故障した ACT 側に吸い込まれて二度と出てこないという<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D6%A5%E9%A5%C3%A5%AF%A5%DB%A1%BC%A5%EB">ブラックホール</a>状態に陥り、当然お客様は通信できなくなってしまいます。</p> <p>ツール試運用中にちょうどこの事象が起きたので、その際の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%AF%A5%EA%A1%BC%A5%F3%A5%B7%A5%E7%A5%C3%A5%C8">スクリーンショット</a>をご紹介します。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20161116/20161116202127.png" alt="f:id:miyahan:20161116202127p:plain" title="f:id:miyahan:20161116202127p:plain" class="hatena-fotolife" itemprop="image"></span><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20161116/20161116202130.png" alt="f:id:miyahan:20161116202130p:plain" title="f:id:miyahan:20161116202130p:plain" class="hatena-fotolife" itemprop="image"></span> LAC全体のグラフ と 該当LAGのみにフィルタしたグラフ</p> <p>5:14 から接続要求がゼロになっているので、ここから障害が発生したもとの推測されます。その5分後、5:19 にPPPのキープアライブ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%BF%A5%A4%A5%E0%A5%A2%A5%A6%A5%C8">タイムアウト</a>が発生し切断処理が行われています。その後、関連部署からの連絡で障害を認知し、5:41 に保守者がLAGのアクティブポートを手動切り替えしサービスが回復しています。</p> <p>もし Graphite のデータを定期的にチェックしアラートを出す手段を確立できれば、このようなサイレント故障をお客様や関連部門からのクレームではなく、監視部門が先に発見し対処することが出来るかもしれません。</p> <h4>ラインカード自己診断NG発生/回復</h4> <p>配下のL2スイッチでラインカードの自己診断NGのアラートが出て、数分後に自然回復するということがよくあります。この手のアラートは、主信号(お客様の通信)に影響がある場合と無い場合があり、もし影響があった場合は速やかにお客様に対しサービス中断発生の連絡をしなければなりません。つまり、なるべく早くサービス影響の有無を判断する必要があります。</p> <p>サービス中断がある場合のグラフを示します</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20161116/20161116205432.png" alt="f:id:miyahan:20161116205432p:plain" title="f:id:miyahan:20161116205432p:plain" class="hatena-fotolife" itemprop="image"></span></p> <p>アラートは 18:57 に発生しました。その瞬間から接続・切断処理が途絶えており、通信に影響があると判断できます。その後アラートは 18:59 に消えました。グラフを見ると 18:59:20 頃からお客様からの再接続要求が来て、切断と接続のイベント数がスパイクしています。</p> <p>もしこれがコマンドによる確認だと、18:59:20 以降にお客様のPPPセッションが張り直されるまでサービス中断に気づくことができません。冒頭で述べた <a class="keyword" href="http://d.hatena.ne.jp/keyword/CLI">CLI</a> が遅い<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%EB%A1%BC%A5%BF%A1%BC">ルーター</a>の場合はコマンドの結果が全て表示されるまで5分程度かかるため、障害発見まで10分を要してしまいます。</p> <p>つまりこのツールを使うことで、<strong>サービス中断の確認作業が10分から10秒に短縮</strong>できるのです!</p> <h4>天災・広域停電</h4> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20161124/20161124172629.png" alt="f:id:miyahan:20161124172629p:plain" title="f:id:miyahan:20161124172629p:plain" class="hatena-fotolife" itemprop="image"></span></p> <p>2016年11月22日 5時59分、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%CA%A1%C5%E7%B8%A9">福島県</a>沖で最大<a class="keyword" href="http://d.hatena.ne.jp/keyword/%BF%CC%C5%D95%BC%E5">震度5弱</a>の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C3%CF%BF%CC">地震</a>が起き、各地で停電・瞬低が発生しましたが、今回作ったツールがこの影響をとらえました。<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C3%CF%BF%CC">地震</a>発生から5分後の 6:04 に一気に<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%BF%A5%A4%A5%E0%A5%A2%A5%A6%A5%C8">タイムアウト</a>による切断処理が起きています。その後ちょろちょろと再接続されていき、15分ほどで平常通りに戻っています。</p> <p>これはうまく使えば広域障害の検出・把握に使えそうですね。ただ現状だとサーバーが非力で、このグラフを出すのに3分もかかってしまうのが課題です・・・。</p> <h4>まとめ</h4> <ul> <li>グラフ化することで状況を "点" ではなく "線" で捉えることができ、直感的に異常が起きたことを把握できる</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%BF%A5%A4%A5%E0%A5%A2%A5%A6%A5%C8">タイムアウト</a>によるセッション切断を待つこと無く、接続・切断要求が途絶えることで異常に気づくことができる</li> </ul> <hr /> <h3>今後の展望</h3> <p>今回ログをリアルタイムに処理し可視化することで、サービスの提供状況を簡単に・素早く・確実に把握できることがわかりました。ただそれは保守者が能動的に<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C0%A5%C3%A5%B7%A5%E5">ダッシュ</a>ボードを開かなければならず、<strong>サイレント故障に対しては全くの無力</strong>です。</p> <p>現在、異常の自動検出の方法を模索中です。Grafana で「ヤバいホスト Top 10」みたいな<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C0%A5%C3%A5%B7%A5%E5">ダッシュ</a>ボードを作ってみても良いでしょうし、別に<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%AF%A5%EA%A5%D7%A5%C8">スクリプト</a>を定期的に走らせて Graphite の <a class="keyword" href="http://d.hatena.ne.jp/keyword/API">API</a> を叩いてデータを取り出して精査してアラートを出すのも良いかもしれません。</p> <p>一番の問題はどうやって異常と判断するかです。数分〜十分単位の起伏があるうえ、1日の生活変動(朝7時頃に起床、午後7時頃に帰宅により増える)や曜日変動(休日は家に居るので変動が少ない)があり一概に<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A4%B7%A4%AD%A4%A4%C3%CD">しきい値</a>や変動率を適用できません。このへん学問的な話になってくるので勉強が必要ですね。</p> <hr /> <p>なんだか業務改善事例の発表ようになってしまいましたが、最も語りたかったのは開発の苦労話で、後半エントリで述べています。ぜひ引き継ぎご覧ください。</p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fmiyalog.hatenablog.jp%2Fentry%2Fradius_graphite_grafana_2" title="Grafana &amp; Graphite でRADIUSのログを可視化してみた 開発編 - miyalog" class="embed-card embed-blogcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;"></iframe><cite class="hatena-citation"><a href="https://miyalog.hatenablog.jp/entry/radius_graphite_grafana_2">miyalog.hatenablog.jp</a></cite></p> miyahan Graphite のチューニングには札束しかなかった話 hatenablog://entry/10328749687193180534 2016-11-20T21:53:22+09:00 2018-09-02T13:45:43+09:00 ネタバレ: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なん… <p><span style="font-size: 150%">ネタバレ:<a class="keyword" href="http://d.hatena.ne.jp/keyword/SSD">SSD</a>にしろ、以上。</span></p> <p>そしてややネタエントリーです。</p> <ul class="table-of-contents"> <li><a href="#いきさつ">いきさつ</a></li> <li><a href="#速さが足りない">速さが足りない!!</a></li> <li><a href="#いいからチューニングだ">いいからチューニングだ!!</a><ul> <li><a href="#MAX_CACHE_SIZE">MAX_CACHE_SIZE</a></li> <li><a href="#MAX_UPDATES_PER_SECOND">MAX_UPDATES_PER_SECOND</a></li> <li><a href="#MAX_CREATES_PER_MINUTE">MAX_CREATES_PER_MINUTE</a></li> <li><a href="#CACHE_WRITE_STRATEGY">CACHE_WRITE_STRATEGY</a></li> <li><a href="#WHISPER_AUTOFLUSH">WHISPER_AUTOFLUSH</a></li> <li><a href="#WHISPER_SPARSE_CREATE--WHISPER_FALLOCATE_CREATE">WHISPER_SPARSE_CREATE / WHISPER_FALLOCATE_CREATE</a></li> <li><a href="#WHISPER_LOCK_WRITES">WHISPER_LOCK_WRITES</a></li> <li><a href="#WHISPER_FADVISE_RANDOM">WHISPER_FADVISE_RANDOM</a></li> </ul> </li> <li><a href="#何の成果も得られませんでしたぁ">何の成果も得られませんでしたぁ!</a><ul> <li><a href="#SSDの場合">SSDの場合</a></li> <li><a href="#HDDの場合">HDDの場合</a></li> </ul> </li> <li><a href="#力こそパワー">力こそパワー!</a></li> <li><a href="#余談SSDなんですぐ死んでしまうん">余談:SSDなんですぐ死んでしまうん?</a><ul> <li><a href="#SSD-TBW-比較">SSD TBW 比較</a></li> </ul> </li> </ul> <hr /> <h3 id="いきさつ">いきさつ</h3> <p>会社で<a class="keyword" href="http://d.hatena.ne.jp/keyword/RADIUS">RADIUS</a>サー<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A1%BC">バー</a>の認証ログを <a href="https://grafana.com/">Grafana</a> + <a href="https://graphiteapp.org">Graphite</a> で可視化するツールを作っていまして、開発版を会社の本番サー<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A1%BC">バー</a>にデプロイしたところ、起動してから数分経つとデータが記録・表示されなくなる不具合が起きました。</p> <p>サー<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A1%BC">バー</a>から収集しているログをダンプしてみたり、Graphiteに送るデータをダンプしてみたり、いろいろ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C7%A5%D0%A5%C3%A5%B0">デバッグ</a>してみたものの原因がわからず途方に暮れてたのですが、結果的に Graphite の統計情報を見ることで原因が判明しました。その大活躍した<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C0%A5%C3%A5%B7%A5%E5">ダッシュ</a>ボードがコチラ!</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20161111/20161111225731.png" alt="f:id:miyahan:20161111225731p:plain" title="f:id:miyahan:20161111225731p:plain" class="hatena-fotolife" itemprop="image"></span>開発環境 (<a class="keyword" href="http://d.hatena.ne.jp/keyword/Fedora">Fedora</a> 24 on <a class="keyword" href="http://d.hatena.ne.jp/keyword/VirtualBox">VirtualBox</a> / <a href="https://jp.ext.hp.com/product/business/pc/desktop/800g1dm/">作業用Windows PC</a>)</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20161111/20161111225746.png" alt="f:id:miyahan:20161111225746p:plain" title="f:id:miyahan:20161111225746p:plain" class="hatena-fotolife" itemprop="image"></span>本番環境 (<a class="keyword" href="http://d.hatena.ne.jp/keyword/CentOS">CentOS</a> 6 on <a class="keyword" href="http://d.hatena.ne.jp/keyword/VMware">VMware</a> vSphere Hypervisor / <a href="https://www.cisco.com/c/ja_jp/products/servers-unified-computing/ucs-5100-series-blade-server-chassis/index.html">ブレードサーバー</a>)</p> <p>なんと本番環境ではメモリ使用量やキャッシュサイズがどんどん肥大し続けています!ちなみにこのまま放置したところ、そのうち過負荷で<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C0%A5%C3%A5%B7%A5%E5">ダッシュ</a>ボードにデータがプロットされなくなり、最終的には carbon-cache が OOM killer 先生によって友愛されました。</p> <p>なお、Graphite の統計情報・上記<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C0%A5%C3%A5%B7%A5%E5">ダッシュ</a>ボードについては関連エントリで詳しく述べています。</p> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fmiyalog.hatenablog.jp%2Fentry%2Fgraphite_carbon_statistics" title="Graphite / Carbon の統計情報を読み解く - miyalog" class="embed-card embed-blogcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;"></iframe></p> <p>それにしても<strong><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C0%A5%C3%A5%B7%A5%E5">ダッシュ</a>ボードを作ってる最中に<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C0%A5%C3%A5%B7%A5%E5">ダッシュ</a>ボードの有用性を思い知る</strong>とは。いやはや。</p> <hr /> <h3 id="速さが足りない">速さが足りない!!</h3> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20161117/20161117210602.png" alt="f:id:miyahan:20161117210602p:plain" title="f:id:miyahan:20161117210602p:plain" class="hatena-fotolife" itemprop="image"></span></p> <p>よくよく<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C0%A5%C3%A5%B7%A5%E5">ダッシュ</a>ボードを見てみると、受信したデータポイント(metricsReceived : 緑色) に対し、ディスク書き込んだデータポイント(committedPoints : 黄色) が大幅に少ないことがわかります。そう、<strong>ディスクへの書き込みが全く間に合っていない</strong>のです。書き込み回数 (updateOperations : 水色) を見てください。虫の息です・・・。</p> <table> <thead> <tr> <th> </th> <th> 開発用PC <a class="keyword" href="http://d.hatena.ne.jp/keyword/VM">VM</a> </th> <th> 本番サー<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A1%BC">バー</a> <a class="keyword" href="http://d.hatena.ne.jp/keyword/VM">VM</a> </th> </tr> </thead> <tbody> <tr> <td> ホストOS </td> <td> <a class="keyword" href="http://d.hatena.ne.jp/keyword/VirtualBox">VirtualBox</a> @ <a class="keyword" href="http://d.hatena.ne.jp/keyword/Windows%207">Windows 7</a> </td> <td> <a class="keyword" href="http://d.hatena.ne.jp/keyword/VMware">VMware</a> vSphere Hypervisor </td> </tr> <tr> <td> ゲストOS </td> <td> <a class="keyword" href="http://d.hatena.ne.jp/keyword/Fedora">Fedora</a> 24 </td> <td> <a class="keyword" href="http://d.hatena.ne.jp/keyword/CentOS">CentOS</a> 6.8 </td> </tr> <tr> <td> CPU / 割り当て </td> <td> 低電圧Core-i5 2GHz / 2core </td> <td> <a class="keyword" href="http://d.hatena.ne.jp/keyword/Xeon">Xeon</a> E7 2.4GHz / 8core </td> </tr> <tr> <td> RAM割り当て </td> <td> 4GB </td> <td> 4GB </td> </tr> <tr> <td> ストレージ </td> <td> <a class="keyword" href="http://d.hatena.ne.jp/keyword/SATA">SATA</a> <a class="keyword" href="http://d.hatena.ne.jp/keyword/SSD">SSD</a> </td> <td> <a class="keyword" href="http://d.hatena.ne.jp/keyword/SAS">SAS</a> 10krpm HDD x2 RAID1 </td> </tr> </tbody> </table> <p>ではなぜ本番サー<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A1%BC">バー</a>だけ書き込みが間に合っていないのでしょうか。最も考えられるのはストレージの違い。でもいくらHDDとはいえ、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A8%A5%F3%A5%BF%A1%BC%A5%D7%A5%E9%A5%A4%A5%BA">エンタープライズ</a>向けの1万回転 <a class="keyword" href="http://d.hatena.ne.jp/keyword/SAS">SAS</a> HDDです。いまどきディスクI/Oが間に合わずシステムが落ちるなんて起こりうるのでしょうか・・・?fio というツールで<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D9%A5%F3%A5%C1%A5%DE%A1%BC%A5%AF">ベンチマーク</a>を取ってみました。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20161117/20161117214239.png" alt="f:id:miyahan:20161117214239p:plain" title="f:id:miyahan:20161117214239p:plain" class="hatena-fotolife" itemprop="image"></span></p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20161117/20161117214641.png" alt="f:id:miyahan:20161117214641p:plain" title="f:id:miyahan:20161117214641p:plain" class="hatena-fotolife" itemprop="image"></span></p> <p>ベタな結果ではありますが、HDDはシーケンシャルアクセスはそこそこなものの、ランダムアクセスがダメダメです。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20161117/20161117215738.png" alt="f:id:miyahan:20161117215738p:plain" title="f:id:miyahan:20161117215738p:plain" class="hatena-fotolife" itemprop="image"></span></p> <p><a href="http://www.aosabook.org/en/graphite.html">The Architecture of Open Source Applications: Graphite</a> より</p> <p>Graphite が採用する Whisper はファイルベースのデータベースで、1メトリック=1ファイルというシンプルな構成になっており、先頭のヘッダを読み込んで、その内容に基づき目的のデータポイントを読み書きしています。すなわち<strong>細かいリード/ライトが大量に走る</strong>ということです。</p> <p>上記<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D9%A5%F3%A5%C1%A5%DE%A1%BC%A5%AF">ベンチマーク</a>では、"Multi Random R/W" が最もその状況に近いでしょう。<a class="keyword" href="http://d.hatena.ne.jp/keyword/SSD">SSD</a>パソコンは6000IOPS に対し、HDDサー<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A1%BC">バー</a>は500IOPS・・・。これはたしかに書き込み間に合わないかも。<a class="keyword" href="http://d.hatena.ne.jp/keyword/SSD">SSD</a>がこのくらい速いのは分かるのですが、<span style="font-size: 150%">本番サー<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A1%BC">バー</a>の1MB/sってなんだよ、数年前の低価格パソコンかよ・・・。<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A8%A5%F3%A5%BF%A1%BC%A5%D7%A5%E9%A5%A4%A5%BA">エンタープライズ</a> 10krpm <a class="keyword" href="http://d.hatena.ne.jp/keyword/SAS">SAS</a> ってなんだったんだよ・・・。</span></p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20161117/20161117221814.png" alt="f:id:miyahan:20161117221814p:plain" title="f:id:miyahan:20161117221814p:plain" class="hatena-fotolife" itemprop="image"></span></p> <hr /> <h3 id="いいからチューニングだ">いいからチューニングだ!!</h3> <p>思うようにパフォーマンスがでない?ならばチューニングを行うべきです。この世の理であり、男と男の約束です。</p> <p>carbon-cache の設定は <code>/etc/carbon/carbon.conf</code> の <code>[cache]</code> セクションに書きます。主要なパラメーターを解説します。</p> <h4 id="MAX_CACHE_SIZE">MAX_CACHE_SIZE</h4> <p>キャッシュするデータポイントの上限を設定します。デフォルトは <code>inf</code> (上限無し)です。キャッシュが満杯になると以後のデータはどんどん捨てられていくようです。本設定はあくまでCPUやメモリが食いつぶされるのを防止するためのもので、パフォーマンスには特に影響ないと思います。</p> <p>OOM killer のお世話にまでなったので、安全のために設定したかったのですが、<strong>キャッシュが溢れた際に大量のトレースバックを吐く不具合</strong>に見舞われ、怖いので <code>inf</code> に戻して運用しています。バグかな?</p> <h4 id="MAX_UPDATES_PER_SECOND">MAX_UPDATES_PER_SECOND</h4> <p>ディスクへの書き込み頻度を設定します。デフォルトは <code>500</code> (500回/秒) です。<code>inf</code> で制限なしにするとデータを受信するたびにディスクへ書き込もうとするため、かなりのCPU・I/Oリソースを消費します。逆に<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C8%A5%E9%A5%D5%A5%A3%A5%C3%A5%AF">トラフィック</a>より少ない値にすると、当然書き込みが間に合わないのでデータはキャッシュにたまっていきます。(上記 <code>MAX_CACHE_SIZE</code> の範囲内である限り)たまったキャッシュは<strong>まとめてディスクに書き込まれるため、結果的に<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%EB%A1%BC%A5%D7%A5%C3%A5%C8">スループット</a>が向上</strong>し、CPU・I/O負荷も軽減されます。しかしキャッシュを貯めすぎるとこんどはキャッシュのソートや出し入れにCPUパワーを持って行かれ過負荷状態に陥る危険があります。今回のチューニングのキーとなるパラメーターです。</p> <h4 id="MAX_CREATES_PER_MINUTE">MAX_CREATES_PER_MINUTE</h4> <p>Whisper のファイルを作成する頻度を設定します。デフォルトは <code>50</code> (50メトリック/分) です。前述したとおり、Whisper データベースは1メトリック=1ファイルで構築されているため、新しいメトリックを受信すると当然新しいファイルがディスクに作成されますが、この設定はそれを制限し<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D5%A5%A1%A5%A4%A5%EB%A5%B7%A5%B9%A5%C6%A5%E0">ファイルシステム</a>の過負荷を防止します。あくまで新規作成時の設定であり、既存の Whisper ファイルの更新処理には影響ありません。</p> <p>ただこの設定には罠があり、これだけ<strong>毎分</strong>なんです。つまりデフォルトだと 0.83メトリック/秒 とあまりに少なすぎます。この上限を超えた場合、<strong>初出メトリックのデータはキャッシュにはたまらず即時破棄される</strong>のも注意ポイントです。デフォルト設定でもし10万メトリックを新規登録する場合、すべてのファイルが作成されるまで1.4日もかかってっしまいます。最初これに気づかずデータが歯抜けになり途方に暮れた苦い思い出があります・・・。今回は 6000 (100メトリック/秒) に変更しました。</p> <h4 id="CACHE_WRITE_STRATEGY">CACHE_WRITE_STRATEGY</h4> <p>貯まったキャッシュを取り出す<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A2%A5%EB%A5%B4%A5%EA%A5%BA%A5%E0">アルゴリズム</a>を選択します。デフォルトは <code>sorted</code> です。解説の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A2%A5%E1%A5%EA">アメリ</a>カ語がよくわからず、未だに理解できていません。。。学のなさがヤバい。</p> <ul> <li><code>sorted</code> : データポイントの数でソートしたリストを作り、リストの上から順にディスクへフラッシュする(?)</li> <li><code>max</code> : 常に最もデータポイントの多いメトリックからディスクへフラッシュする。ランダムアクセスが減る。</li> <li><code>naive</code> : なにも考えずに取り出す。<a class="keyword" href="http://d.hatena.ne.jp/keyword/SSD">SSD</a>の場合や、ランダムアクセスを補償できる(ライトバッファ?)場合におすすめ。</li> </ul> <p>なんとなく <code>max</code> が一番I/O負荷が低いように思えます。これも重要そうなパラメーターです。</p> <h4 id="WHISPER_AUTOFLUSH">WHISPER_AUTOFLUSH</h4> <p>ディスク書き込み時に同期を行うか選択します。デフォルトは <code>False</code> (同期しない)です。データ永続化の話ですかね?速さ優先なのでもちろん False で。</p> <h4 id="WHISPER_SPARSE_CREATE--WHISPER_FALLOCATE_CREATE">WHISPER_SPARSE_CREATE / WHISPER_FALLOCATE_CREATE</h4> <p>Whisper ファイル新規作成時の設定。アップデート時のパフォーマンスと関係ないので割愛。</p> <h4 id="WHISPER_LOCK_WRITES">WHISPER_LOCK_WRITES</h4> <p>Whisper ファイルのロック処理を行うかの接待。デフォルトは <code>False</code> (ロックしない)です。アクセス競合するような使い方はしないので False で。</p> <h4 id="WHISPER_FADVISE_RANDOM">WHISPER_FADVISE_RANDOM</h4> <p>Graphite 0.10 から追加されるオプションのようです。<a class="keyword" href="http://d.hatena.ne.jp/keyword/posix">posix</a>_fadvise() を発行するかを選択します。デフォルトは <code>False</code> (発行しない)です。必要なくなったキャッシュをOSに通知し解放させることで、キャッシュの効率向上・<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%E9%A5%C3%A5%B7%A5%F3%A5%B0">スラッシング</a>防止が期待できるようです。0.10 はまだ安定版が出ていないので試していません。</p> <pre class="code" data-lang="" data-unlink>$ vmstat -SM 10 procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu----- r b swpd free buff cache si so bi bo in cs us sy id wa st 3 2 866 124 254 434 0 0 2512 8776 35520 57272 23 9 56 12 0 2 1 866 110 254 436 0 0 697 8256 36592 59316 33 9 50 8 0 4 1 866 110 254 441 0 0 1812 5549 37019 61120 29 9 50 11 0 1 2 866 101 255 449 0 0 2655 8168 35035 57074 22 10 56 13 0 6 0 867 145 250 418 0 0 1819 7171 39260 64974 30 10 51 10 0 $ sar -r 11時30分01秒 kbmemfree kbmemused %memused kbbuffers kbcached kbcommit %commit 11時30分01秒 139296 3782212 96.45 232312 1860440 3064788 37.76 11時40分01秒 321900 3599608 91.79 242592 1603500 3142096 38.72 11時50分01秒 137392 3784116 96.50 252884 1626128 3265420 40.24</pre> <p>ちなみにうちの本番環境(メモリ4GB)は<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%E9%A5%C3%A5%B7%A5%F3%A5%B0">スラッシング</a>が発生するほどひどくはないものの、ページキャッシュには全く期待できない(1.6GBしかない)というなんとも微妙な状況。</p> <hr /> <h3 id="何の成果も得られませんでしたぁ">何の成果も得られませんでしたぁ!</h3> <p>というわけで神パラメーターを求め、早速<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D9%A5%F3%A5%C1%A5%DE%A1%BC%A5%AF">ベンチマーク</a>してみましょう</p> <h4 id="SSDの場合"><a class="keyword" href="http://d.hatena.ne.jp/keyword/SSD">SSD</a>の場合</h4> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20161118/20161118024456.png" alt="f:id:miyahan:20161118024456p:plain" title="f:id:miyahan:20161118024456p:plain" class="hatena-fotolife" itemprop="image"></span><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20161118/20161118024511.png" alt="f:id:miyahan:20161118024511p:plain" title="f:id:miyahan:20161118024511p:plain" class="hatena-fotolife" itemprop="image"></span></p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20161118/20161118024624.png" alt="f:id:miyahan:20161118024624p:plain" title="f:id:miyahan:20161118024624p:plain" class="hatena-fotolife" itemprop="image"></span><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20161118/20161118024628.png" alt="f:id:miyahan:20161118024628p:plain" title="f:id:miyahan:20161118024628p:plain" class="hatena-fotolife" itemprop="image"></span></p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20161118/20161118024638.png" alt="f:id:miyahan:20161118024638p:plain" title="f:id:miyahan:20161118024638p:plain" class="hatena-fotolife" itemprop="image"></span><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20161118/20161118024642.png" alt="f:id:miyahan:20161118024642p:plain" title="f:id:miyahan:20161118024642p:plain" class="hatena-fotolife" itemprop="image"></span></p> <table> <thead> <tr> <th> CPU </th> <th> inf </th> <th> 3000 update/s </th> <th> 500 update/s </th> </tr> </thead> <tbody> <tr> <td> sorted </td> <td> 46% </td> <td> 29% </td> <td> 17% </td> </tr> <tr> <td> max </td> <td> 46% </td> <td> 33% </td> <td> 15% </td> </tr> <tr> <td> naive </td> <td> 44% </td> <td> 29% </td> <td> 17% </td> </tr> </tbody> </table> <p>I/Oに余裕があるためか、どの<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A2%A5%EB%A5%B4%A5%EA%A5%BA%A5%E0">アルゴリズム</a>を選択しても変化はありませんでした。アップデート頻度を落としても、その分キャッシュが貯まるだけで特に目立った変化は無し。ただ<strong>書き込み処理が減った分CPU使用率が下がった</strong>のは発見ですね。<a class="keyword" href="http://d.hatena.ne.jp/keyword/SSD">SSD</a>の場合、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C8%A5%E9%A5%D5%A5%A3%A5%C3%A5%AF">トラフィック</a>が増えていくと先にCPUが行き詰まるはずなので、そのような場合は <code>MAX_UPDATES_PER_SECOND</code> を調整したいところです。</p> <h4 id="HDDの場合">HDDの場合</h4> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20161118/20161118031355.png" alt="f:id:miyahan:20161118031355p:plain" title="f:id:miyahan:20161118031355p:plain" class="hatena-fotolife" itemprop="image"></span><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20161118/20161118031358.png" alt="f:id:miyahan:20161118031358p:plain" title="f:id:miyahan:20161118031358p:plain" class="hatena-fotolife" itemprop="image"></span></p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20161118/20161118031409.png" alt="f:id:miyahan:20161118031409p:plain" title="f:id:miyahan:20161118031409p:plain" class="hatena-fotolife" itemprop="image"></span></p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20161118/20161118031421.png" alt="f:id:miyahan:20161118031421p:plain" title="f:id:miyahan:20161118031421p:plain" class="hatena-fotolife" itemprop="image"></span><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20161118/20161118031425.png" alt="f:id:miyahan:20161118031425p:plain" title="f:id:miyahan:20161118031425p:plain" class="hatena-fotolife" itemprop="image"></span></p> <table> <thead> <tr> <th> CPU </th> <th> inf </th> <th> 1000 update/s </th> </tr> </thead> <tbody> <tr> <td> sorted </td> <td> 38% </td> <td> 39% </td> </tr> <tr> <td> max </td> <td> 102% </td> <td> 未実施 </td> </tr> <tr> <td> naive </td> <td> 37% </td> <td> 35% </td> </tr> </tbody> </table> <table> <thead> <tr> <th> commit </th> <th> inf </th> <th> 1000 update/s </th> </tr> </thead> <tbody> <tr> <td> sorted </td> <td> 431/s </td> <td> 454/s </td> </tr> <tr> <td> max </td> <td> 0/s </td> <td> 未実施 </td> </tr> <tr> <td> naive </td> <td> 488/s </td> <td> 457/s </td> </tr> </tbody> </table> <table> <thead> <tr> <th> cache </th> <th> inf </th> <th> 1000 update/s </th> </tr> </thead> <tbody> <tr> <td> sorted </td> <td> 546K </td> <td> 600K </td> </tr> <tr> <td> max </td> <td> 2973K </td> <td> 未実施 </td> </tr> <tr> <td> naive </td> <td> 573K </td> <td> 629K </td> </tr> </tbody> </table> <p>完全にI/Oがカツカツで、指定した制限値に達することもできません。ランダムアクセスが弱いことから <code>CACHE_WRITE_STRATEGY</code> の設定が効いてくると思いきや、なんと <strong>sorted とnaive で有意な差は見られません</strong>でした。<a class="keyword" href="http://d.hatena.ne.jp/keyword/RAID">RAID</a>コントローラで吸収されているんでしょうか? 一方で、<strong>max にしたところCPUが大暴走</strong>。ほとんどディスクフラッシュが行えておらずフン詰まり状態に陥ってしまいました。キャッシュ内の最大値を求める処理に持って行かれてしまったのでしょうか?しかし <a class="keyword" href="http://d.hatena.ne.jp/keyword/SSD">SSD</a>で MAX・500update/s にしたときにCPU使用率に変化が無かったことからつじつまが合いません。謎です・・・。</p> <p>というわけで<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D9%A5%F3%A5%C1%A5%DE%A1%BC%A5%AF">ベンチマーク</a>の結果、ブレイクスルーは発見されず、<strong>HDDの遅さはどうしようもできないという悲しい現実</strong>だけが残るのでした。</p> <hr /> <h3 id="力こそパワー">力こそパワー!</h3> <p>結局有効な手段はなく、<strong><span style="font-size: 150%">たくさんのメモリと高速なストレージが唯一の解決法</span></strong>という結論に至りました。</p> <p>うちの場合は、自宅で余っていた128GB <a class="keyword" href="http://d.hatena.ne.jp/keyword/SSD">SSD</a> を <a class="keyword" href="http://d.hatena.ne.jp/keyword/Amazon">Amazon</a> で800円で買った <a class="keyword" href="http://d.hatena.ne.jp/keyword/USB3.0">USB3.0</a> HDDケース に入れて、会社の余っているPCにつなげて暫定 Graphite サー<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A1%BC">バー</a>にしています。数百万円する<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D6%A5%EC%A1%BC%A5%C9%A5%B5%A1%BC%A5%D0%A1%BC">ブレードサーバー</a>が数千円の USB <a class="keyword" href="http://d.hatena.ne.jp/keyword/SSD">SSD</a> に負けたのです。</p> <hr /> <h3 id="余談SSDなんですぐ死んでしまうん">余談:<a class="keyword" href="http://d.hatena.ne.jp/keyword/SSD">SSD</a>なんですぐ死んでしまうん?</h3> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/SSD">SSD</a>パソコンで試験運用させていたところ、後輩君から「あのパソコン、昨日からたまにピロロンと変な音がなるんですけど?」との報告が。それは定番SMART監視ソフト Crystal Disk Info の通知メロディのことでした。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20161120/20161120203041.png" alt="f:id:miyahan:20161120203041p:plain" title="f:id:miyahan:20161120203041p:plain" class="hatena-fotolife" itemprop="image"></span></p> <p>(;゚д゚) あ、あれ、1日ちょっとでライフタイムが3%も減ってる・・・。ファームのバグかな?</p> <p>念のため計算してみましょう。開発中のツールを動かすと、常時 25MB/s ほどのディスク書き込みが発生します。ということは1日2.16TB。今回使った crucial M550 128GB の TBW (Total Byte Written) は 72TB ですので、つまり、えーと、<strong>33日で寿命</strong>・・・。</p> <p>(((( ;゚д゚))))</p> <p>愚かにも、<strong>サー<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A1%BC">バー</a>向け<a class="keyword" href="http://d.hatena.ne.jp/keyword/SSD">SSD</a>がなぜ法外なほどに高価なのかわかった瞬間</strong>でした。</p> <p>もちろん TBW は保証値であり、実施はその数倍書ける場合が多いことが知られていますが、それでも半年持たせるのが関の山です。どうにかしないといけません。ためしに carbon-cache の書き込み頻度をいじってみました。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20161120/20161120204535.png" alt="f:id:miyahan:20161120204535p:plain" title="f:id:miyahan:20161120204535p:plain" class="hatena-fotolife" itemprop="image"></span></p> <p>おお!書き込み頻度(<code>MAX_UPDATES_PER_SECOND</code>)を減らすと、ディスク書き込み<strong>量</strong> も減っています。<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%DC%A5%EA%A5%E5%A1%BC%A5%E0%A5%C7%A5%A3%A5%B9%A5%AB%A5%A6%A5%F3%A5%C8">ボリュームディスカウント</a>恐るべし。(ただ、header の読み込みが1回で済むのでリードが減るのはわかるのですが、書き込み量が減る理屈がよくわかりません・・・)ともかく、たとえば頻度を<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C8%A5%E9%A5%D5%A5%A3%A5%C3%A5%AF">トラフィック</a>(6000 metrics/s)の 1/8、750 updates/s に設定するとディスク書き込み量を 80% 削減することができます。これだと5ヶ月でTBWに達する計算です。2年くらいなら持ちそう??</p> <p>というわけで<a class="keyword" href="http://d.hatena.ne.jp/keyword/SSD">SSD</a>は速いけど、調子乗ってぶん回すと寿命がゴリゴリ減っていくという教訓が得られました。<strong><span style="font-size: 150%"><a class="keyword" href="http://d.hatena.ne.jp/keyword/%B6%E4%A4%CE%C3%C6%B4%DD">銀の弾丸</a>(<a class="keyword" href="http://d.hatena.ne.jp/keyword/SSD">SSD</a>)は脆い</span></strong></p> <p>まあ本来であれば、Grafana + Graphite なんて超書き込み特化な使い方だと、HDD をちゃんとしたコントローラを使って RAID50 とかにして運用すべきなんだと思います。</p> <h4 id="SSD-TBW-比較"><a class="keyword" href="http://d.hatena.ne.jp/keyword/SSD">SSD</a> TBW 比較</h4> <p>というわけでPCサー<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A1%BC">バー</a>で<a class="keyword" href="http://d.hatena.ne.jp/keyword/SSD">SSD</a>を使う場合、TBWにも考慮して選定する必要があります。TBW を公開している主要メーカーのコンシューマー向け<a class="keyword" href="http://d.hatena.ne.jp/keyword/SSD">SSD</a>を比較してみました。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20161120/20161120211721.png" alt="f:id:miyahan:20161120211721p:plain" title="f:id:miyahan:20161120211721p:plain" class="hatena-fotolife" itemprop="image"></span></p> <p>容量とTBWの両方を考えると、2.5インチ <a class="keyword" href="http://d.hatena.ne.jp/keyword/SATA">SATA</a> は定番の crucial MX300 がよさそうですね。1TB3万円とはいい時代になったもんです。m.2 MVMe だと <a class="keyword" href="http://d.hatena.ne.jp/keyword/Intel">Intel</a> と <a class="keyword" href="http://d.hatena.ne.jp/keyword/PLEXTOR">PLEXTOR</a> がそこそこいい感じで、<a class="keyword" href="http://d.hatena.ne.jp/keyword/Samsung">Samsung</a> が性能・値段ともにぶっちぎっています。960 PRO ほしー!!</p> <p>なお、<strong><a class="keyword" href="http://d.hatena.ne.jp/keyword/SanDisk">SanDisk</a> など一部メーカーはサー<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A1%BC">バー</a>用途に使うとメーカー保証が剥奪される</strong>場合があるので、保証規定をよく読んで購入しましょう。基本的に長寿命・長期保証を謳っているのにTBWを非公開にしているメーカーには罠があると思っておいたほうがよさそうです。あと、必要分より1つ上の大容量モデルを選ぶのも寿命を延ばす上では有利です。</p> <hr /> <p>以上、時系列データベースは札束で殴れというお話でした。失礼いたしました。</p> miyahan Graphite / Carbon の統計情報を読み解く hatenablog://entry/10328749687194824474 2016-11-17T23:21:14+09:00 2018-09-02T13:45:56+09:00 Graphite の データ記録を担う Carbon には自身の統計情報を自身のデータベースに記録する機能があります。以前パフォーマンス問題の調査のためにこれを使ったのですが、各パラメーターが何を意味しているのか、ドキュメントを探したものの見つからず苦労しました。 そこで、記録された実データや、設定変更に伴う挙動から「たぶんこうだろう」と思うところをメモとして残しておきます。もしお役に立てば幸いです。また、公式ドキュメントのありかや有用な情報をご存じの方、誤りを見つけた場合はぜひコメントください。 Carbon statistics の設定 cpuUsage / memUsage avgUpd… <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20161116/20161116181011.png" alt="f:id:miyahan:20161116181011p:plain" title="f:id:miyahan:20161116181011p:plain" class="hatena-fotolife" itemprop="image"></span></p> <p><a href="https://graphiteapp.org">Graphite</a> の データ記録を担う Carbon には自身の統計情報を自身のデータベースに記録する機能があります。以前パフォーマンス問題の調査のためにこれを使ったのですが、各パラメーターが何を意味しているのか、ドキュメントを探したものの見つからず苦労しました。</p> <p>そこで、記録された実データや、設定変更に伴う挙動から「たぶんこうだろう」と思うところをメモとして残しておきます。もしお役に立てば幸いです。また、公式ドキュメントのありかや有用な情報をご存じの方、誤りを見つけた場合はぜひコメントください。</p> <ul class="table-of-contents"> <li><a href="#Carbon-statistics-の設定">Carbon statistics の設定</a></li> <li><a href="#cpuUsage--memUsage">cpuUsage / memUsage</a></li> <li><a href="#avgUpdateTime">avgUpdateTime</a></li> <li><a href="#metricsReceived--committedPoints">metricsReceived / committedPoints</a></li> <li><a href="#updateOperations--pointsPerUpdate">updateOperations / pointsPerUpdate</a></li> <li><a href="#cachequeues--cachesize">cache.queues / cache.size</a></li> <li><a href="#cachequeries">cache.queries</a></li> </ul> <hr /> <h3 id="Carbon-statistics-の設定">Carbon statistics の設定</h3> <p>この機能はデフォルトでONになっているので、何をしなくてもすぐ使えます。ちなみに <code>/etc/carbon/carbon.conf</code> で明示的に設定することができます。</p> <pre class="code" data-lang="" data-unlink># By default, Carbon itself will log statistics (such as a count, # metricsReceived) with the top level prefix of &#39;Carbon&#39; 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秒間隔で記録される</pre> <p>初期設定ではログを90日間保存するようになっています。これを変更する場合は <code>/etc/carbon/storage-schema.conf</code> を編集してからデータベースを再構築してください。</p> <pre class="code" data-lang="" data-unlink>[carbon] pattern = ^carbon\. retentions = 60:90d</pre> <h3 id="cpuUsage--memUsage">cpuUsage / memUsage</h3> <p>まあ文字通りCPUとメモリの使用量を示しているようです。しかし若干注意が必要です。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20161117/20161117180237.png" alt="f:id:miyahan:20161117180237p:plain" title="f:id:miyahan:20161117180237p:plain" class="hatena-fotolife" itemprop="image"></span> 図:CPUが100%に張り付いていたときの<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C0%A5%C3%A5%B7%A5%E5">ダッシュ</a>ボード</p> <p>上例では top コマンドでみるとずっと100%に張り付いていたのですが、<code>cpuUsage</code> だと 80%前後と値に差異がありました。単に誤差なのか、もしかすると carbon-cache プロセス全体ではなく、writerスレッド(データの書き込みを行うスレッド)のCPU使用率を示しているのかもしれません。</p> <p>Carbon はマルチスレッドで動作していますが、<a class="keyword" href="http://d.hatena.ne.jp/keyword/Python">Python</a> の<a href="https://ja.wikipedia.org/wiki/%E3%82%B0%E3%83%AD%E3%83%BC%E3%83%90%E3%83%AB%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%97%E3%83%AA%E3%82%BF%E3%83%AD%E3%83%83%E3%82%AF">グローバルインタプリタロック</a>という制約によって、<strong>CPUチップ・コア数に対してスケールしません</strong>。すなわちCPU使用率がほぼ100%になっていたら、書き込み処理が滞留していないか確認が必要です。</p> <h3 id="avgUpdateTime">avgUpdateTime</h3> <p>ディスクへの書き込みに要した時間(おそらくms)を示していると思います。ディスクの性能や、一度に書き込むデータポイント量に左右されます。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20161117/20161117184058.png" alt="f:id:miyahan:20161117184058p:plain" title="f:id:miyahan:20161117184058p:plain" class="hatena-fotolife" itemprop="image"></span><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20161117/20161117184101.png" alt="f:id:miyahan:20161117184101p:plain" title="f:id:miyahan:20161117184101p:plain" class="hatena-fotolife" itemprop="image"></span> <span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20161117/20161117184110.png" alt="f:id:miyahan:20161117184110p:plain" title="f:id:miyahan:20161117184110p:plain" class="hatena-fotolife" itemprop="image"></span><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20161117/20161117184114.png" alt="f:id:miyahan:20161117184114p:plain" title="f:id:miyahan:20161117184114p:plain" class="hatena-fotolife" itemprop="image"></span></p> <p>やはり HDD と <a class="keyword" href="http://d.hatena.ne.jp/keyword/SSD">SSD</a> ではまさに桁違いですね。特に HDD ではログローテーションなど、I/Oを伴うバックグラウンド処理が走ったものなら、さらにズドンと跳ね上がります。</p> <p>このパラメーターはディスクの状態を把握することはできますが、Carbon の状態を確認するにはあまり使えないでしょう。「ああ、HDDさんキツそうだな・・・」くらいに見ておきましょう。</p> <h3 id="metricsReceived--committedPoints">metricsReceived / committedPoints</h3> <p>これらはデータの IN と OUT を表すパラメーターです。<code>metricsReceived</code> は Carbon が受信した<strong>データポイント量</strong>、<code>committedPoints</code> はディスクへ書き込んだ<strong>データポイント量</strong>を示しているようです。つまりフィルタで記録するデータを絞り込んでいない限り、下図のように中期的に見て <strong>この2つのパラメーターは概ねイコール</strong>になっていなければなりません。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20161117/20161117190452.png" alt="f:id:miyahan:20161117190452p:plain" title="f:id:miyahan:20161117190452p:plain" class="hatena-fotolife" itemprop="image"></span></p> <p>なおこれらのパラメーターは前回の測定(デフォルトで60秒前)からの増分を記録しているようなので、この<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C0%A5%C3%A5%B7%A5%E5">ダッシュ</a>ボードでは 1/60 = <code>scale(0.1667)</code> して毎秒値に換算しています。</p> <h3 id="updateOperations--pointsPerUpdate">updateOperations / pointsPerUpdate</h3> <p>これらはディスクへの書き込みに関連するパラメーターです。<code>updateOperations</code> はディスクへ書き込んだ<strong>回数</strong>を示しているようです。これも増分値ですので<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C0%A5%C3%A5%B7%A5%E5">ダッシュ</a>ボード上は 1/60 して毎秒値に換算しています。一方、<code>pointsPerUpdate</code> は1回のディスクフラッシュで書き込んだ<strong>データポイント量</strong>を示しているようです。</p> <p>すなわち、updateOperations[回] × pointsPerUpdate[データポイント/回] ≒ committedPoints[データポイント] という関係が成り立ちます。<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C0%A5%C3%A5%B7%A5%E5">ダッシュ</a>ボードでも確かめてみましょう。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20161117/20161117194604.png" alt="f:id:miyahan:20161117194604p:plain" title="f:id:miyahan:20161117194604p:plain" class="hatena-fotolife" itemprop="image"></span> 図:<code>MAX_UPDATES_PER_SECOND = inf</code></p> <p>まずは書き込み頻度を無制限にした場合。受信したデータはその都度即時ディスクにフラッシュされているため、metricsReceived ≒ updateOperations ≒ committedPoints ≒ 6000 となっています。1回の受信で1回書き込んでいるため、pointsPerUpdate は 1 となります。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20161117/20161117202510.png" alt="f:id:miyahan:20161117202510p:plain" title="f:id:miyahan:20161117202510p:plain" class="hatena-fotolife" itemprop="image"></span> 図:<code>MAX_UPDATES_PER_SECOND = 3000</code></p> <p>次に書き込み頻度を<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C8%A5%E9%A5%D5%A5%A3%A5%C3%A5%AF">トラフィック</a>のおよそ半分、3000回/秒に設定した場合。ディスクフラッシュの頻度(updateOperations) が3000回/秒になっていますね。また pointsPerUpdate より1回のディスクフラッシュで平均2個のデータポイントを書き込んでいることがわかります。3000回/秒 × 2データポイント/回 = 6000データポイント/秒 となるわけです。</p> <p>実際にこれらのパラメーターがどのような比になるかは、設定やディスクのI/O性能に左右されます。</p> <h3 id="cachequeues--cachesize">cache.queues / cache.size</h3> <p>今度はメモリキャッシュに関するパラメーターです。これは Carbon の書き込み状況を知るために最も役立つものです。<code>cache.queues</code> はメモリキャッシュに入っている<strong>メトリック</strong>の数、<code>cache.size</code> はメモリキャッシュに入っている<strong>データポイント</strong>の数を示しているようです。これに気づくまでずいぶん苦労しました・・・。</p> <pre class="code" data-lang="" data-unlink>00:00 もも組.うさぎさん 30 00:00 みかん組.くまさん 5 00:01 もも組.うさぎさん 15 00:01 みかん組.くまさん 7 00:02 もも組.うさぎさん 40 00:02 みかん組.くまさん 9 00:03 もも組.うさぎさん 20 00:03 みかん組.くまさん 6 00:04 もも組.うさぎさん 25 00:04 みかん組.くまさん 8 00:05 もも組.うさぎさん 30 00:05 みかん組.くまさん 7 00:06 もも組.うさぎさん 35 00:06 みかん組.くまさん 11 00:07 もも組.うさぎさん 40 00:07 みかん組.くまさん 9 00:08 もも組.うさぎさん 35 00:08 みかん組.くまさん 10 00:09 もも組.うさぎさん 30 00:09 みかん組.くまさん 8</pre> <p>例えば上記のデータがキャッシュに入った場合、メトリックは "もも組.うさぎさん" と "みかん組.くまさん" の2種類だけなので cache.queues は 2、データポイントは20個あるので cache.size は 20 となります。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20161117/20161117214916.png" alt="f:id:miyahan:20161117214916p:plain" title="f:id:miyahan:20161117214916p:plain" class="hatena-fotolife" itemprop="image"></span> 図:ディスクへの書き込みが間に合わず、どんどんキャッシュサイズが増大している事例</p> <p>記録するメトリックは予め決まっている場合が多いので、どんなに多くの<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C8%A5%E9%A5%D5%A5%A3%A5%C3%A5%AF">トラフィック</a>が突っ込んできても cache.queues はある決まった値で頭打ちとなりますが、cache.size はディスクフラッシュが追いつかない場合、無限に増大していきます。つまり、<strong>cache.size こそが Carbon のI/O負荷監視の最重要パラメーター</strong>と言えます。これが増加していたらヤバい!!</p> <h3 id="cachequeries">cache.queries</h3> <p>これまでパラメーターとは違って、<code>cache.queries</code> はデータを<strong>読み込む</strong>頻度を示しています。Grafana で<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C0%A5%C3%A5%B7%A5%E5">ダッシュ</a>ボードの再読み込みボタンを連打するとこの値が増加します。これも増分値ですので<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C0%A5%C3%A5%B7%A5%E5">ダッシュ</a>ボード上は 1/60 して毎秒値に換算しています。</p> <p>ところで Graphite はクエリを受けると、ディスクにあるデータ(Whisperデータベース) を読み込みつつ、Carbon がメモリに保持しているフラッシュ待ちのキャッシュも読み込み、それらをマージしてクライアントに返答しています。名前から察するに、cache.queries は厳密に言えば、Graphite が Carbon のキャッシュに問い合わせた回数を記録しているのかもしれません。</p> <hr /> <p>いかがでしたでしょうか。大量のデータを Graphite で記録している方で、ときどきデータが記録されなくなったり表示されなくなったりする、プロセスを再起動したらなぜか半日分のデータが吹っ飛んだ、といったトラブルが起きた場合は、ぜひ Carbon の統計情報を見て<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AA%A1%BC%A5%D0%A1%BC%A5%ED%A1%BC%A5%C9">オーバーロード</a>が発生していないかチェックしてみてください。</p> miyahan VirtualBox のストレージは本当に遅いのか? vs VMware Fusion hatenablog://entry/10328749687193838569 2016-11-11T01:48:34+09:00 2016-11-13T14:48:07+09:00 VirtualBox のストレージが遅いという話をしばしば耳にするので、ベンチマークを行い VMware Fusion と比べてみた。また固定サイズ VS 可変サイズ、キャッシュのON / OFF も比較。 <p>ネットをただよっていると、<a class="keyword" href="http://d.hatena.ne.jp/keyword/VirtualBox">VirtualBox</a> のディスクは <a class="keyword" href="http://d.hatena.ne.jp/keyword/VMware">VMware</a> と比べて数倍遅いとか、いやいや<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B8%C7%C4%EA%A5%C7%A5%A3%A5%B9%A5%AF">固定ディスク</a>にすると速いとか、いろんな意見が出てきます。最近、高いI/O<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%EB%A1%BC%A5%D7%A5%C3%A5%C8">スループット</a>が必要なツールを作っていることもあり、興味が出たので<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D9%A5%F3%A5%C1%A5%DE%A1%BC%A5%AF">ベンチマーク</a>を取ってみました。</p> <h3>測定条件</h3> <ul> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D9%A5%F3%A5%C1%A5%DE%A1%BC%A5%AF">ベンチマーク</a>ソフト : fio 2.x</li> <li>各テストケースを5回実行し中央値を採用</li> <li>測定マシン: <a class="keyword" href="http://d.hatena.ne.jp/keyword/Mac%20Pro">Mac Pro</a> mid 2010 <ul> <li>OS : <a class="keyword" href="http://d.hatena.ne.jp/keyword/macOS">macOS</a> Sierra</li> <li>RAM: 20GB</li> <li>Disk : crucial M550 (ただしSATA2.0接続) (システムディスク兼用)</li> </ul> </li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/VMware">VMware</a> : <a class="keyword" href="http://d.hatena.ne.jp/keyword/Mac">Mac</a> 上で動作する <a class="keyword" href="http://d.hatena.ne.jp/keyword/VMware%20Fusion">VMware Fusion</a> 8.5 で測定 <ul> <li>CPU : 4コア</li> <li>RAM : 4GB</li> <li>仮想ディスク : 32GB <ul> <li>ディスク関連の設定はデフォルト</li> </ul> </li> <li>ゲストOS : <a class="keyword" href="http://d.hatena.ne.jp/keyword/Fedora">Fedora</a> 24 64bit</li> </ul> </li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/VirtualBox">VirtualBox</a> : <a class="keyword" href="http://d.hatena.ne.jp/keyword/Mac">Mac</a> 上で動作する <a class="keyword" href="http://d.hatena.ne.jp/keyword/VirtualBox">VirtualBox</a> 5.1 で測定 <ul> <li>CPU : 4コア</li> <li>RAM : 4GB</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C1%A5%C3%A5%D7%A5%BB%A5%C3%A5%C8">チップセット</a>: ICH9</li> <li>ディスクコントローラ: <a class="keyword" href="http://d.hatena.ne.jp/keyword/SATA">SATA</a> <ul> <li>ホストのI/Oキャッシュを使うオプション : オン / オフ それぞれで測定</li> </ul> </li> <li>仮想ディスク : 32GB <ul> <li>ディスクタイプ : 可変VDI / 固定VDI それぞれで測定</li> <li>仮想ディスクの <a class="keyword" href="http://d.hatena.ne.jp/keyword/SSD">SSD</a> フラグをON</li> </ul> </li> <li>ゲストOS : <a class="keyword" href="http://d.hatena.ne.jp/keyword/Fedora">Fedora</a> 24 64bit</li> </ul> </li> </ul> <p>テストケースは次のとおり。</p> <table> <thead> <tr> <th> テストケース </th> <th> テストモード </th> <th> テストサイズ </th> <th> ブロックサイズ </th> <th> 並列度 </th> </tr> </thead> <tbody> <tr> <td> Single Sequential Read </td> <td> read </td> <td> 8GB </td> <td> 1MB </td> <td> QD1 </td> </tr> <tr> <td> Single Sequential Write </td> <td> write </td> <td> 8GB </td> <td> 1MB </td> <td> QD1 </td> </tr> <tr> <td> Multi Sequential Read </td> <td> read </td> <td> 8GB </td> <td> 128KB </td> <td> QD32 </td> </tr> <tr> <td> Multi Sequential Write </td> <td> write </td> <td> 8GB </td> <td> 128KB </td> <td> QD32 </td> </tr> <tr> <td> Single <a class="keyword" href="http://d.hatena.ne.jp/keyword/Random%20Read">Random Read</a> </td> <td> randread </td> <td> 4GB </td> <td> 4KB </td> <td> QD1 </td> </tr> <tr> <td> Single Random Write </td> <td> randwrite </td> <td> 4GB </td> <td> 4KB </td> <td> QD1 </td> </tr> <tr> <td> Multi <a class="keyword" href="http://d.hatena.ne.jp/keyword/Random%20Read">Random Read</a> </td> <td> randread </td> <td> 4GB </td> <td> 4KB </td> <td> QD32 </td> </tr> <tr> <td> Multi Random Write </td> <td> randwrite </td> <td> 4GB </td> <td> 4KB </td> <td> QD32 </td> </tr> <tr> <td> Multi Random R/W </td> <td> randrw </td> <td> 4GB </td> <td> 4KB </td> <td> QD32 </td> </tr> </tbody> </table> <p>実際には次の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%AF%A5%EA%A5%D7%A5%C8">スクリプト</a>を作成し実行しています。</p> <pre class="code" data-lang="" data-unlink>#!/bin/bash for i in {0..4} do fio -direct=1 -invalidate=1 -name=SingleSeqRead -filename=fio.tmp -size=8G -bs=1M -iodepth=1 -rw=read &gt;&gt; 21-SingleSeqRead-O_DIRECT.log fio -direct=1 -invalidate=1 -name=SingleSeqWrite -filename=fio.tmp -size=8G -bs=1M -iodepth=1 -rw=write &gt;&gt; 22-SingleSeqWrite-O_DIRECT.log fio -direct=1 -invalidate=1 -name=MultiSeqRead -filename=fio.tmp -size=8G -bs=128K -iodepth=32 -rw=read &gt;&gt; 23-MultiSeqRead-O_DIRECT.log fio -direct=1 -invalidate=1 -name=MultiSeqWrite -filename=fio.tmp -size=8G -bs=128K -iodepth=32 -rw=write &gt;&gt; 24-MultiSeqWrite-O_DIRECT.log fio -direct=1 -invalidate=1 -name=SingleRandRead -filename=fio.tmp -size=4G -bs=4K -iodepth=1 -rw=randread &gt;&gt; 25-SingleRandRead-O_DIRECT.log fio -direct=1 -invalidate=1 -name=SingleRandWrite -filename=fio.tmp -size=4G -bs=4K -iodepth=1 -rw=randwrite &gt;&gt; 26-SigleRandWrite-O_DIRECT.log fio -direct=1 -invalidate=1 -name=MultiRandRead -filename=fio.tmp -size=4G -bs=4K -iodepth=32 -rw=randread &gt;&gt; 27-MultiRandRead-O_DIRECT.log fio -direct=1 -invalidate=1 -name=MultiRandWrite -filename=fio.tmp -size=4G -bs=4K -iodepth=32 -rw=randwrite &gt;&gt; 28-MultiRandWrite-O_DIRECT.log fio -direct=1 -invalidate=1 -name=MultiRandRW -filename=fio.tmp -size=4G -bs=4K -iodepth=32 -rw=randrw &gt;&gt; 29-MultiRandRW-O_DIRECT.log done rm fio.tmp </pre> <h3>測定結果</h3> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20161111/20161111000023.png" alt="f:id:miyahan:20161111000023p:plain" title="f:id:miyahan:20161111000023p:plain" class="hatena-fotolife" itemprop="image"></span></p> <p>まずはシーケンシャルアクセス。リード性能はホストOSのキャッシュが効いているためか、<a class="keyword" href="http://d.hatena.ne.jp/keyword/VMware">VMware</a>・<a class="keyword" href="http://d.hatena.ne.jp/keyword/VirtualBox">VirtualBox</a>(ホストキャッシュON) ともに物理マシンより高い値が出ています。特に<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B8%C7%C4%EA%A5%C7%A5%A3%A5%B9%A5%AF">固定ディスク</a>の <a class="keyword" href="http://d.hatena.ne.jp/keyword/VirtualBox">VirtualBox</a> では異常なまでのハイスコアです。ちょっとリードテストの結果はまゆつばですな。</p> <ul> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/VirtualBox">VirtualBox</a> より <a class="keyword" href="http://d.hatena.ne.jp/keyword/VMware">VMware</a> のほうが 16% (ブレ幅の大きかったSingle Sequential Read の結果を除くと8%) ほど高速</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/VirtualBox">VirtualBox</a> のホストキャッシュを切ると、リード性能が50%、ライト性能が12%低下する</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/VirtualBox">VirtualBox</a> の可変ディスクを<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B8%C7%C4%EA%A5%C7%A5%A3%A5%B9%A5%AF">固定ディスク</a>にすると、リード性能が130%(まゆつば)、ライト性能が9%向上する</li> </ul> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20161111/20161111000024.png" alt="f:id:miyahan:20161111000024p:plain" title="f:id:miyahan:20161111000024p:plain" class="hatena-fotolife" itemprop="image"></span></p> <p>つぎにランダムアクセス。ランダムR/Wの結果を見ると、どの<a class="keyword" href="http://d.hatena.ne.jp/keyword/VM">VM</a>も物理マシンの半分以下のパフォーマンスしか出せていないことがわかります。細かい読み書きを行うデータベースサーバーを<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B2%BE%C1%DB%A5%DE%A5%B7%A5%F3">仮想マシン</a>で運用するのは厳しいということですね。</p> <ul> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/VirtualBox">VirtualBox</a> より <a class="keyword" href="http://d.hatena.ne.jp/keyword/VMware">VMware</a> のほうが27%高速(特にリードが得意で、45%高速)</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/VirtualBox">VirtualBox</a> のホストキャッシュを切ると、リード性能が38%低下するが、ライト性能は15%向上した(!?)</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/VirtualBox">VirtualBox</a> の可変ディスクを<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B8%C7%C4%EA%A5%C7%A5%A3%A5%B9%A5%AF">固定ディスク</a>にすると、リード性能が16%向上する(ライト性能は変わらず)</li> </ul> <h3>所感</h3> <h4><a class="keyword" href="http://d.hatena.ne.jp/keyword/VirtualBox">VirtualBox</a> vs <a class="keyword" href="http://d.hatena.ne.jp/keyword/VMware">VMware</a></h4> <p>総じて <a class="keyword" href="http://d.hatena.ne.jp/keyword/VMware">VMware</a> は <a class="keyword" href="http://d.hatena.ne.jp/keyword/VirtualBox">VirtualBox</a> よりも速く、特にリードが得意でした。システムのパフォーマンスに影響するランダムR/Wの結果から、 <strong><a class="keyword" href="http://d.hatena.ne.jp/keyword/VirtualBox">VirtualBox</a> は <a class="keyword" href="http://d.hatena.ne.jp/keyword/VMware">VMware</a> より2割くらい遅い</strong>と言えるのではないでしょうか。<a class="keyword" href="http://d.hatena.ne.jp/keyword/VMware%20Fusion">VMware Fusion</a> は有償ですし、<a class="keyword" href="http://d.hatena.ne.jp/keyword/VMware">VMware</a> Workstation Player は商用利用(会社内での自学自習・お遊びを含む)できませんし、「タダなんだから仕方ない」で済む範囲内ですかね。</p> <h4>ホストキャッシュON vs OFF</h4> <p>場合によりけりだと思います。ただ前提として、<strong>ホストキャッシュを切るとパフォーマンスが半分以下になってしまう場合がある</strong>と覚えておきましょう。ちなみに、今回は<a class="keyword" href="http://d.hatena.ne.jp/keyword/SSD">SSD</a>環境でしたがランダムアクセスが弱いHDDだとライトバッファ(遅延書き込み)を利用することでライト性能も大きな効果があると思います。</p> <p>ホストキャッシュをOFFにしたほうがよいケース</p> <ul> <li>メモリサイズに余裕が無い場合</li> <li>不意にホストが死んでもデータロストが起きないことを保証しなくてはいけない場合</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%B2%BE%C1%DB%A5%DE%A5%B7%A5%F3">仮想マシン</a>を動かしながら、ホストOS側でもヘビーな作業を行う場合</li> </ul> <p>ホストキャッシュをONにしたほうがよいケース</p> <ul> <li>HDDのノートパソコンなど、ホストのディスクが遅い場合</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%B2%BE%C1%DB%A5%DE%A5%B7%A5%F3">仮想マシン</a>の動作中、ホストOS側であまり作業を行わない場合</li> <li>データベースサーバーなど高いI/O<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%EB%A1%BC%A5%D7%A5%C3%A5%C8">スループット</a>が要求される場合</li> </ul> <h4>可変ディスク vs <a class="keyword" href="http://d.hatena.ne.jp/keyword/%B8%C7%C4%EA%A5%C7%A5%A3%A5%B9%A5%AF">固定ディスク</a></h4> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/%B8%C7%C4%EA%A5%C7%A5%A3%A5%B9%A5%AF">固定ディスク</a>/キャッシュONでのシーケンシャルリードの結果がぶっちぎれているように、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B8%C7%C4%EA%A5%C7%A5%A3%A5%B9%A5%AF">固定ディスク</a>にするとホストキャッシュの効果を受けやすくなるようです。ただこれは<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D9%A5%F3%A5%C1%A5%DE%A1%BC%A5%AF">ベンチマーク</a>の性質上の話で、実際には<strong><a class="keyword" href="http://d.hatena.ne.jp/keyword/%B8%C7%C4%EA%A5%C7%A5%A3%A5%B9%A5%AF">固定ディスク</a>にすると1割くらい高速になるかもしれない</strong>程度に考えておくのがよいでしょう。仮想ディスクのサイズ変更は面倒なので、余裕を持って多めに割り当てるのが一般的だと思いますが、それを<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B8%C7%C4%EA%A5%C7%A5%A3%A5%B9%A5%AF">固定ディスク</a>で作ってしまうとディスクスペースを圧迫してしまい、バックアップも大変です。個人的にはこの程度の恩恵であれば可変ディスクでよいと思います。</p> <h3>おわりに</h3> <p>今回システム(<a class="keyword" href="http://d.hatena.ne.jp/keyword/macOS">macOS</a>)が稼働している<a class="keyword" href="http://d.hatena.ne.jp/keyword/SSD">SSD</a>上に<a class="keyword" href="http://d.hatena.ne.jp/keyword/VM">VM</a>の仮想ディスクファイルを置いたため、テスト中にさまざまなバックグラウンド処理が走り結果が乱れてしまい苦労しました。</p> <p>また最初は1GBでテストしたのですが、tempファイルがすべてメモリに乗ったためか数GB/s とかいうあり得ないスコアが出たので、多めにしてテストを全部やり直したりもしました。(それでも若干怪しい数字が出てしまいました・・・。)とくにかく時間もかかりますし、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D9%A5%F3%A5%C1%A5%DE%A1%BC%A5%AF">ベンチマーク</a>って大変だなあと思いました。(小並感)</p> miyahan Python の datetime.strptime がすんごく遅い件 hatenablog://entry/10328749687193053486 2016-11-05T13:36:11+09:00 2018-04-17T17:08:47+09:00 会社でRADIUSサーバーの認証ログをリアルタイムに解析するツールを作っていたところ、思ったようなパフォーマンスが出ず、line_profiler というプロファイリングツールを使って調べたところ、処理時間の大部分を datetime.strptime で日時の文字列を datetime オブジェクトに変換する一行のコードが占めていました。 strptime だけでスクリプト実行時間の83%を占めている。あきらかにここが原因 そこで、日時の文字列を自分で区切って datetime.datetime() に渡すようにしたところ、処理速度が飛躍的に向上しボトルネックは無くなりました。 下記サンプル… <p>会社で<a class="keyword" href="http://d.hatena.ne.jp/keyword/RADIUS">RADIUS</a>サーバーの認証ログをリアルタイムに解析するツールを作っていたところ、思ったようなパフォーマンスが出ず、<a href="https://github.com/rkern/line_profiler">line_profiler</a> というプロファイリングツールを使って調べたところ、処理時間の大部分を <a href="https://docs.python.jp/3/library/datetime.html#datetime.datetime.strptime">datetime.strptime</a> で日時の文字列を datetime オブジェクトに変換する一行のコードが占めていました。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20161112/20161112020142.png" alt="f:id:miyahan:20161112020142p:plain" title="f:id:miyahan:20161112020142p:plain" class="hatena-fotolife" itemprop="image"></span>strptime だけで<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%AF%A5%EA%A5%D7%A5%C8">スクリプト</a>実行時間の83%を占めている。あきらかにここが原因</p> <p>そこで、日時の文字列を自分で区切って <a href="https://docs.python.jp/3/library/datetime.html#datetime.datetime">datetime.datetime()</a> に渡すようにしたところ、処理速度が飛躍的に向上し<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%DC%A5%C8%A5%EB%A5%CD%A5%C3%A5%AF">ボトルネック</a>は無くなりました。</p> <p>下記サンプルコードを使って<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D9%A5%F3%A5%C1%A5%DE%A1%BC%A5%AF">ベンチマーク</a>をしたところ、strptime はなんと4倍以上遅い!(実行環境: <a class="keyword" href="http://d.hatena.ne.jp/keyword/macOS">macOS</a> <a class="keyword" href="http://d.hatena.ne.jp/keyword/Sierra">Sierra</a> / <a class="keyword" href="http://d.hatena.ne.jp/keyword/Python">Python</a> 3.5.2)</p> <pre class="code lang-python" data-lang="python" data-unlink><span class="synPreProc">from</span> datetime <span class="synPreProc">import</span> datetime <span class="synPreProc">import</span> time logtime_str = <span class="synConstant">'20170101123456'</span> start = time.time() <span class="synStatement">for</span> i <span class="synStatement">in</span> <span class="synIdentifier">range</span>(<span class="synConstant">100000</span>): dt = datetime.strptime(logtime_str, <span class="synConstant">'%Y%m%d%H%M%S'</span>) <span class="synIdentifier">print</span>(<span class="synConstant">'strptime: {:.4f}sec, dt:{}'</span>.<span class="synIdentifier">format</span>(time.time() - start, dt)) <span class="synComment"># strptime: 2.2368sec, dt:2017-01-01 12:34:56</span> </pre> <pre class="code lang-python" data-lang="python" data-unlink><span class="synPreProc">from</span> datetime <span class="synPreProc">import</span> datetime <span class="synPreProc">import</span> time logtime_str = <span class="synConstant">'20170101123456'</span> start = time.time() <span class="synStatement">for</span> i <span class="synStatement">in</span> <span class="synIdentifier">range</span>(<span class="synConstant">100000</span>): dt = datetime( year=<span class="synIdentifier">int</span>(logtime_str[<span class="synConstant">0</span>:<span class="synConstant">4</span>]), month=<span class="synIdentifier">int</span>(logtime_str[<span class="synConstant">4</span>:<span class="synConstant">6</span>]), day=<span class="synIdentifier">int</span>(logtime_str[<span class="synConstant">6</span>:<span class="synConstant">8</span>]), hour=<span class="synIdentifier">int</span>(logtime_str[<span class="synConstant">8</span>:<span class="synConstant">10</span>]), minute=<span class="synIdentifier">int</span>(logtime_str[<span class="synConstant">10</span>:<span class="synConstant">12</span>]), second=<span class="synIdentifier">int</span>(logtime_str[<span class="synConstant">12</span>:<span class="synConstant">14</span>]) ) <span class="synIdentifier">print</span>(<span class="synConstant">'self parse: {:.4f}sec, dt:{}'</span>.<span class="synIdentifier">format</span>(time.time() - start, dt)) <span class="synComment"># self parse: 0.5266sec, dt:2017-01-01 12:34:56</span> </pre> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/Python">Python</a> 標準のプロファイリングライブラリ <a href="https://docs.python.jp/3.3/library/profile.html">cProfile</a> を視覚化する <a href="http://pycallgraph.readthedocs.io/en/master/">Python Call Graph</a> というツールを使ってみました。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20161105/20161105130657.png" alt="f:id:miyahan:20161105130657p:plain" title="f:id:miyahan:20161105130657p:plain" class="hatena-fotolife" itemprop="image"></span></p> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/%C0%B5%B5%AC%C9%BD%B8%BD">正規表現</a>は使い回しされているようですが、なぜか毎回<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%ED%A5%B1%A1%BC%A5%EB">ロケール</a>情報を取りに行っていて結構な時間がかかっているようです。今回のコードでは使っていませんが、strptime は曜日( 'Monday', '月曜' )なども取り扱えるため、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%ED%A5%B1%A1%BC%A5%EB">ロケール</a>を解釈する処理が入っているのでしょうか。それにしても時間かかりすぎてません?使い方間違ってるのかな・・・。</p> <p>テキストのパースは奥が深いことはわかりますが、よく使う標準ライブラリにこのような罠があるというのは少しショックです。。。</p> <hr /> <h3>ほかの言語でも遅い?</h3> <p>(2016/11/8追記) 他の言語はどうなんだろうと思い、力不足ながらも比較してみました</p> <h4>vs <a class="keyword" href="http://d.hatena.ne.jp/keyword/Ruby">Ruby</a></h4> <p>まずは、意識高い系言語 <a class="keyword" href="http://d.hatena.ne.jp/keyword/Ruby">Ruby</a>。こんなただ <a class="keyword" href="http://d.hatena.ne.jp/keyword/ruby">ruby</a> の構文に置き換えただけのコード、<a class="keyword" href="http://d.hatena.ne.jp/keyword/Rubyist">Rubyist</a> に見られたら八つ裂きにされそうですが、どうか勘弁してください。</p> <pre class="code" data-lang="" data-unlink>miyahan$ ruby -v ruby 2.3.1p112 (2016-04-26 revision 54768) [x86_64-darwin16]</pre> <pre class="code lang-ruby" data-lang="ruby" data-unlink><span class="synPreProc">require</span> <span class="synSpecial">'</span><span class="synConstant">date</span><span class="synSpecial">'</span> <span class="synPreProc">require</span> <span class="synSpecial">'</span><span class="synConstant">time</span><span class="synSpecial">'</span> logtime_str = <span class="synSpecial">'</span><span class="synConstant">20170101123456</span><span class="synSpecial">'</span> start = <span class="synType">Time</span>.now <span class="synStatement">for</span> i <span class="synStatement">in</span> <span class="synConstant">0</span>..<span class="synConstant">100000</span> <span class="synStatement">do</span> dt = <span class="synType">DateTime</span>.strptime(logtime_str, <span class="synSpecial">'</span><span class="synConstant">%Y%m%d%H%M%S</span><span class="synSpecial">'</span>) <span class="synStatement">end</span> print(<span class="synSpecial">'</span><span class="synConstant">DateTime.parse: </span><span class="synSpecial">'</span>, <span class="synType">Time</span>.now - start, <span class="synSpecial">'</span><span class="synConstant">sec. </span><span class="synSpecial">'</span>) print(<span class="synSpecial">'</span><span class="synConstant">dt: </span><span class="synSpecial">'</span>, dt, <span class="synSpecial">&quot;\n&quot;</span>) <span class="synComment"># DateTime.parse: 0.30088sec. dt: 2017-01-01T12:34:56+00:00</span> </pre> <pre class="code lang-ruby" data-lang="ruby" data-unlink><span class="synPreProc">require</span> <span class="synSpecial">'</span><span class="synConstant">date</span><span class="synSpecial">'</span> <span class="synPreProc">require</span> <span class="synSpecial">'</span><span class="synConstant">time</span><span class="synSpecial">'</span> logtime_str = <span class="synSpecial">'</span><span class="synConstant">20170101123456</span><span class="synSpecial">'</span> start = <span class="synType">Time</span>.now <span class="synStatement">for</span> i <span class="synStatement">in</span> <span class="synConstant">0</span>..<span class="synConstant">100000</span> <span class="synStatement">do</span> dt = <span class="synType">DateTime</span>.new( logtime_str[<span class="synConstant">0</span>, <span class="synConstant">4</span>].to_i, logtime_str[<span class="synConstant">4</span>, <span class="synConstant">2</span>].to_i, logtime_str[<span class="synConstant">6</span>, <span class="synConstant">2</span>].to_i, logtime_str[<span class="synConstant">8</span>, <span class="synConstant">2</span>].to_i, logtime_str[<span class="synConstant">10</span>, <span class="synConstant">2</span>].to_i, logtime_str[<span class="synConstant">12</span>, <span class="synConstant">2</span>].to_i ) <span class="synStatement">end</span> print(<span class="synSpecial">'</span><span class="synConstant">DateTime.new: </span><span class="synSpecial">'</span>, <span class="synType">Time</span>.now - start, <span class="synSpecial">'</span><span class="synConstant">sec. </span><span class="synSpecial">'</span>) print(<span class="synSpecial">'</span><span class="synConstant">dt: </span><span class="synSpecial">'</span>, dt, <span class="synSpecial">&quot;\n&quot;</span>) <span class="synComment"># DateTime.new: 0.198785sec. dt: 2017-01-01T12:34:56+00:00</span> </pre> <p>手動パースしたほうが34%ほど高速</p> <h4>vs <a class="keyword" href="http://d.hatena.ne.jp/keyword/PHP">PHP</a></h4> <p>次に、私の愛するゆるふわ言語 <a class="keyword" href="http://d.hatena.ne.jp/keyword/PHP">PHP</a>。久しぶりに書くとドルやらセミコロンやらカッコやら面倒くさい。</p> <pre class="code" data-lang="" data-unlink>miyahan$ php --version PHP 7.0.12 (cli) (built: Oct 14 2016 09:56:59) ( NTS ) Copyright (c) 1997-2016 The PHP Group Zend Engine v3.0.0, Copyright (c) 1998-2016 Zend Technologies</pre> <pre class="code lang-php" data-lang="php" data-unlink><span class="synSpecial">&lt;?php</span> <span class="synStatement">$</span><span class="synIdentifier">logtime_str</span> <span class="synStatement">=</span> '<span class="synConstant">20170101123456</span>'; <span class="synStatement">$</span><span class="synIdentifier">start</span> <span class="synStatement">=</span> <span class="synIdentifier">microtime</span><span class="synSpecial">(</span><span class="synConstant">true</span><span class="synSpecial">)</span>; <span class="synStatement">for</span> <span class="synSpecial">(</span><span class="synStatement">$</span><span class="synIdentifier">i</span><span class="synStatement">=</span><span class="synConstant">0</span>; <span class="synStatement">$</span><span class="synIdentifier">i</span><span class="synStatement">&lt;</span><span class="synConstant">100000</span>; <span class="synStatement">$</span><span class="synIdentifier">i</span><span class="synStatement">++</span><span class="synSpecial">)</span> <span class="synSpecial">{</span> <span class="synStatement">$</span><span class="synIdentifier">dt</span> <span class="synStatement">=</span> \DateTime<span class="synStatement">::</span>createFromFormat<span class="synSpecial">(</span>'<span class="synConstant">YmdHis</span>', <span class="synStatement">$</span><span class="synIdentifier">logtime_str</span><span class="synSpecial">)</span>; <span class="synSpecial">}</span> <span class="synPreProc">print</span><span class="synSpecial">(</span>'<span class="synConstant">DateTime:</span>'<span class="synStatement">.</span><span class="synIdentifier">number_format</span><span class="synSpecial">(</span><span class="synIdentifier">microtime</span><span class="synSpecial">(</span><span class="synConstant">true</span><span class="synSpecial">)</span> <span class="synStatement">-</span> <span class="synStatement">$</span><span class="synIdentifier">start</span>, <span class="synConstant">5</span><span class="synSpecial">)</span><span class="synStatement">.</span>&quot;<span class="synConstant">sec, </span>&quot;<span class="synSpecial">)</span>; <span class="synPreProc">print</span><span class="synSpecial">(</span>&quot;<span class="synConstant">dt:</span>&quot;<span class="synStatement">.$</span><span class="synIdentifier">dt</span><span class="synType">-&gt;</span>format<span class="synSpecial">(</span>'<span class="synConstant">Y-m-d H:i:s</span>'<span class="synSpecial">)</span><span class="synStatement">.</span>&quot;<span class="synSpecial">\n</span>&quot;<span class="synSpecial">)</span>; <span class="synComment"># DateTime:0.21719sec, dt:2017-01-01 12:34:56</span> </pre> <pre class="code lang-php" data-lang="php" data-unlink><span class="synSpecial">&lt;?php</span> <span class="synStatement">$</span><span class="synIdentifier">logtime_str</span> <span class="synStatement">=</span> '<span class="synConstant">20170101123456</span>'; <span class="synStatement">$</span><span class="synIdentifier">start</span> <span class="synStatement">=</span> <span class="synIdentifier">microtime</span><span class="synSpecial">(</span><span class="synConstant">true</span><span class="synSpecial">)</span>; <span class="synStatement">for</span> <span class="synSpecial">(</span><span class="synStatement">$</span><span class="synIdentifier">i</span><span class="synStatement">=</span><span class="synConstant">0</span>; <span class="synStatement">$</span><span class="synIdentifier">i</span><span class="synStatement">&lt;</span><span class="synConstant">100000</span>; <span class="synStatement">$</span><span class="synIdentifier">i</span><span class="synStatement">++</span><span class="synSpecial">)</span> <span class="synSpecial">{</span> <span class="synStatement">$</span><span class="synIdentifier">ts</span> <span class="synStatement">=</span> <span class="synIdentifier">mktime</span><span class="synSpecial">(</span> <span class="synIdentifier">substr</span><span class="synSpecial">(</span><span class="synStatement">$</span><span class="synIdentifier">logtime_str</span>, <span class="synConstant">8</span>, <span class="synConstant">2</span><span class="synSpecial">)</span>, <span class="synIdentifier">substr</span><span class="synSpecial">(</span><span class="synStatement">$</span><span class="synIdentifier">logtime_str</span>, <span class="synConstant">10</span>, <span class="synConstant">2</span><span class="synSpecial">)</span>, <span class="synIdentifier">substr</span><span class="synSpecial">(</span><span class="synStatement">$</span><span class="synIdentifier">logtime_str</span>, <span class="synConstant">12</span>, <span class="synConstant">2</span><span class="synSpecial">)</span>, <span class="synIdentifier">substr</span><span class="synSpecial">(</span><span class="synStatement">$</span><span class="synIdentifier">logtime_str</span>, <span class="synConstant">4</span>, <span class="synConstant">2</span><span class="synSpecial">)</span>, <span class="synIdentifier">substr</span><span class="synSpecial">(</span><span class="synStatement">$</span><span class="synIdentifier">logtime_str</span>, <span class="synConstant">6</span>, <span class="synConstant">2</span><span class="synSpecial">)</span>, <span class="synIdentifier">substr</span><span class="synSpecial">(</span><span class="synStatement">$</span><span class="synIdentifier">logtime_str</span>, <span class="synConstant">0</span>, <span class="synConstant">4</span><span class="synSpecial">)</span> <span class="synSpecial">)</span>; <span class="synSpecial">}</span> <span class="synPreProc">print</span><span class="synSpecial">(</span>'<span class="synConstant">mktime:</span>'<span class="synStatement">.</span><span class="synIdentifier">number_format</span><span class="synSpecial">(</span><span class="synIdentifier">microtime</span><span class="synSpecial">(</span><span class="synConstant">true</span><span class="synSpecial">)</span> <span class="synStatement">-</span> <span class="synStatement">$</span><span class="synIdentifier">start</span>, <span class="synConstant">5</span><span class="synSpecial">)</span><span class="synStatement">.</span>&quot;<span class="synConstant">sec, </span>&quot;<span class="synSpecial">)</span>; <span class="synPreProc">print</span><span class="synSpecial">(</span>&quot;<span class="synConstant">dt:</span>&quot;<span class="synStatement">.</span><span class="synIdentifier">date</span><span class="synSpecial">(</span>'<span class="synConstant">Y-m-d H:i:s</span>', <span class="synStatement">$</span><span class="synIdentifier">ts</span><span class="synSpecial">)</span><span class="synStatement">.</span>&quot;<span class="synSpecial">\n</span>&quot;<span class="synSpecial">)</span>; <span class="synComment"># mktime:0.18713sec, dt:2017-01-01 12:34:56</span> </pre> <pre class="code lang-php" data-lang="php" data-unlink><span class="synSpecial">&lt;?php</span> <span class="synStatement">$</span><span class="synIdentifier">logtime_str</span> <span class="synStatement">=</span> '<span class="synConstant">20170101123456</span>'; <span class="synStatement">$</span><span class="synIdentifier">start</span> <span class="synStatement">=</span> <span class="synIdentifier">microtime</span><span class="synSpecial">(</span><span class="synConstant">true</span><span class="synSpecial">)</span>; <span class="synStatement">for</span> <span class="synSpecial">(</span><span class="synStatement">$</span><span class="synIdentifier">i</span><span class="synStatement">=</span><span class="synConstant">0</span>; <span class="synStatement">$</span><span class="synIdentifier">i</span><span class="synStatement">&lt;</span><span class="synConstant">100000</span>; <span class="synStatement">$</span><span class="synIdentifier">i</span><span class="synStatement">++</span><span class="synSpecial">)</span> <span class="synSpecial">{</span> <span class="synStatement">$</span><span class="synIdentifier">ts</span> <span class="synStatement">=</span> <span class="synIdentifier">gmmktime</span><span class="synSpecial">(</span> <span class="synIdentifier">substr</span><span class="synSpecial">(</span><span class="synStatement">$</span><span class="synIdentifier">logtime_str</span>, <span class="synConstant">8</span>, <span class="synConstant">2</span><span class="synSpecial">)</span>, <span class="synIdentifier">substr</span><span class="synSpecial">(</span><span class="synStatement">$</span><span class="synIdentifier">logtime_str</span>, <span class="synConstant">10</span>, <span class="synConstant">2</span><span class="synSpecial">)</span>, <span class="synIdentifier">substr</span><span class="synSpecial">(</span><span class="synStatement">$</span><span class="synIdentifier">logtime_str</span>, <span class="synConstant">12</span>, <span class="synConstant">2</span><span class="synSpecial">)</span>, <span class="synIdentifier">substr</span><span class="synSpecial">(</span><span class="synStatement">$</span><span class="synIdentifier">logtime_str</span>, <span class="synConstant">4</span>, <span class="synConstant">2</span><span class="synSpecial">)</span>, <span class="synIdentifier">substr</span><span class="synSpecial">(</span><span class="synStatement">$</span><span class="synIdentifier">logtime_str</span>, <span class="synConstant">6</span>, <span class="synConstant">2</span><span class="synSpecial">)</span>, <span class="synIdentifier">substr</span><span class="synSpecial">(</span><span class="synStatement">$</span><span class="synIdentifier">logtime_str</span>, <span class="synConstant">0</span>, <span class="synConstant">4</span><span class="synSpecial">)</span> <span class="synSpecial">)</span>; <span class="synSpecial">}</span> <span class="synPreProc">print</span><span class="synSpecial">(</span>'<span class="synConstant">gmmktime:</span>'<span class="synStatement">.</span><span class="synIdentifier">number_format</span><span class="synSpecial">(</span><span class="synIdentifier">microtime</span><span class="synSpecial">(</span><span class="synConstant">true</span><span class="synSpecial">)</span> <span class="synStatement">-</span> <span class="synStatement">$</span><span class="synIdentifier">start</span>, <span class="synConstant">5</span><span class="synSpecial">)</span><span class="synStatement">.</span>&quot;<span class="synConstant">sec, </span>&quot;<span class="synSpecial">)</span>; <span class="synPreProc">print</span><span class="synSpecial">(</span>&quot;<span class="synConstant">dt:</span>&quot;<span class="synStatement">.</span><span class="synIdentifier">date</span><span class="synSpecial">(</span>'<span class="synConstant">Y-m-d H:i:s</span>', <span class="synStatement">$</span><span class="synIdentifier">ts</span><span class="synSpecial">)</span><span class="synStatement">.</span>&quot;<span class="synSpecial">\n</span>&quot;<span class="synSpecial">)</span>; <span class="synComment"># gmmktime:0.14538sec, dt:2017-01-01 12:34:56</span> </pre> <p>手動パースは、モダンな <a href="https://secure.php.net/manual/ja/class.datetime.php">DateTime クラス</a> を使うより33%高速。ただし、<a class="keyword" href="http://d.hatena.ne.jp/keyword/GMT">GMT</a>と見なして処理する gmmktime() の代わりに、自環境の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%BF%A5%A4%A5%E0%A5%BE%A1%BC%A5%F3">タイムゾーン</a>を考慮する mktime() を使うと、その差は14%ほどに縮まるので、DateTime クラスを使うことのオーバーヘッドはそこまでないと思います。</p> <h4>まとめ</h4> <table> <thead> <tr> <th> 言語 </th> <th> 高級な方法 </th> <th> 高速な方法 </th> <th> 比 </th> </tr> </thead> <tbody> <tr> <td> <a class="keyword" href="http://d.hatena.ne.jp/keyword/Python">Python</a> 3.5 </td> <td> 2.2368s </td> <td> 0.5266s </td> <td> 428% </td> </tr> <tr> <td> <a class="keyword" href="http://d.hatena.ne.jp/keyword/Ruby">Ruby</a> 2.3 </td> <td> 0.3009s </td> <td> 0.1988s </td> <td> 151% </td> </tr> <tr> <td> <a class="keyword" href="http://d.hatena.ne.jp/keyword/PHP">PHP</a> 7.0 </td> <td> 0.2172s </td> <td> 0.1454s </td> <td> 149% </td> </tr> </tbody> </table> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/Ruby">Ruby</a> も <a class="keyword" href="http://d.hatena.ne.jp/keyword/PHP">PHP</a> も高級な機能を使うことによりで処理時間が50%ほど増えています。ただ一般的なアプリケーションであれば、その柔軟で強力な機能を簡潔なコードで実現できるというメリットに対して、十分ペイできるオーバーヘッドだと思います。一方 <a class="keyword" href="http://d.hatena.ne.jp/keyword/Python">Python</a> は428%とちょっと許容できない、というかバグじゃないかと疑うレベルです・・・。</p> <p>それにしても、<a class="keyword" href="http://d.hatena.ne.jp/keyword/Python">Python</a> っておっそいですね・・・。というか <a class="keyword" href="http://d.hatena.ne.jp/keyword/PHP">PHP</a> 大健闘。</p> miyahan Mac mini のメモリをRMAするの巻 hatenablog://entry/10328749687191229513 2016-10-25T18:14:06+09:00 2018-04-17T17:00:37+09:00 Mac mini のメモリ(永久保証)が壊れたのでRMAしてもらったお話 <h2>これまでの流れ</h2> <p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fmiyalog.hatenablog.jp%2Fentry%2FMacPro_AppleCare" title="iMac サルベージ中に Mac Pro が故障するの巻 - miyalog" class="embed-card embed-blogcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;"></iframe><cite class="hatena-citation"><a href="https://miyalog.hatenablog.jp/entry/MacPro_AppleCare">miyalog.hatenablog.jp</a></cite></p> <ul> <li>2016年8月 : 妹の <a class="keyword" href="http://d.hatena.ne.jp/keyword/iMac">iMac</a> が壊れる</li> <li>2016年8月 : 自分の <a class="keyword" href="http://d.hatena.ne.jp/keyword/Mac%20Pro">Mac Pro</a> が壊れる</li> <li>2016年9月 : <a class="keyword" href="http://d.hatena.ne.jp/keyword/%BC%AB%C2%F0%A5%B5%A1%BC%A5%D0">自宅サーバ</a>ー用の <a class="keyword" href="http://d.hatena.ne.jp/keyword/Mac%20mini">Mac mini</a> が壊れる ← New !!</li> </ul> <p>('A`) ...</p> <h2>無限アップデート地獄</h2> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20161025/20161025174912.jpg" alt="f:id:miyahan:20161025174912j:plain" title="f:id:miyahan:20161025174912j:plain" class="hatena-fotolife" itemprop="image"></span><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20161025/20161025174916.jpg" alt="f:id:miyahan:20161025174916j:plain" title="f:id:miyahan:20161025174916j:plain" class="hatena-fotolife" itemprop="image"></span></p> <p>先日、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%BC%AB%C2%F0%A5%B5%A1%BC%A5%D0">自宅サーバ</a>ーとして使っている <a class="keyword" href="http://d.hatena.ne.jp/keyword/Mac%20mini">Mac mini</a> (Mid 2011) を <a class="keyword" href="http://d.hatena.ne.jp/keyword/macOS">macOS</a> <a class="keyword" href="http://d.hatena.ne.jp/keyword/Sierra">Sierra</a> にアップグレードしようとしたところ、インストール → 失敗 → 再起動 → インストール → 失敗... の無限ループに陥り起動しなくなってしまいました。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20161025/20161025174934.jpg" alt="f:id:miyahan:20161025174934j:plain" title="f:id:miyahan:20161025174934j:plain" class="hatena-fotolife" itemprop="image"></span></p> <p>指示通り <a class="keyword" href="http://d.hatena.ne.jp/keyword/AHT">AHT</a> (<a class="keyword" href="http://d.hatena.ne.jp/keyword/Apple">Apple</a> Hardware Test) をしてみると、テストの途中でフリーズしてしまいました。何らかのハードウェア障害が発生しているようです。ためしにメモリを昔使っていたものに取り替えてみたところ、<a class="keyword" href="http://d.hatena.ne.jp/keyword/AHT">AHT</a>が完走し、<a class="keyword" href="http://d.hatena.ne.jp/keyword/Sierra">Sierra</a>のアップデートも無事完了しました。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20161025/20161025175611.png" alt="f:id:miyahan:20161025175611p:plain" title="f:id:miyahan:20161025175611p:plain" class="hatena-fotolife" itemprop="image"></span></p> <p>たしかに以前からたまに<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AB%A1%BC%A5%CD%A5%EB%A5%D1%A5%CB%A5%C3%A5%AF">カーネルパニック</a>が起きたり、<a class="keyword" href="http://d.hatena.ne.jp/keyword/kaspersky">kaspersky</a> でたびたび「<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A6%A5%A4%A5%EB%A5%B9%C4%EA%B5%C1%A5%D5%A5%A1%A5%A4%A5%EB">ウイルス定義ファイル</a>が破損しています」という警告がでたりと不安定ではありました。なるほどメモリか。メモリに乗ってる<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A6%A5%A4%A5%EB%A5%B9%C4%EA%B5%C1%A5%D5%A5%A1%A5%A4%A5%EB">ウイルス定義ファイル</a>のデータが化けて、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C1%A5%A7%A5%C3%A5%AF%A5%B5%A5%E0">チェックサム</a>か何かで検出された的な?</p> <h2>Let's <a class="keyword" href="http://d.hatena.ne.jp/keyword/RMA">RMA</a></h2> <p>現在使用しているメモリはCFD販売の永久保証がついたものだったので、お言葉に甘えて交換してもらうことに。</p> <p>CFD販売は基本的に販売店対応になるらしいのですが、自分の場合は <a class="keyword" href="http://d.hatena.ne.jp/keyword/Amazon">Amazon</a> (通販) で買ったので、<a href="http://archive.cfd.co.jp/support/warranty.html">CFD販売 サポート案内</a> にあるテンプレを記入して直接メーカーにメール。2日後に返信があり、次のものをそろえて返品受付センタに送ってくれとのこと。</p> <ul> <li>商品(メモリ本体)</li> <li>保証書(メモリの場合は商品のパッケージが保証書になるらしい)</li> <li>メールに添付されてきた「修理依頼書」(<a class="keyword" href="http://d.hatena.ne.jp/keyword/Microsoft">Microsoft</a> <a class="keyword" href="http://d.hatena.ne.jp/keyword/Excel">Excel</a> 必須)</li> <li>購入時のレシート・納品書のコピー</li> </ul> <p>荷物を送った数日後、よくある「終売品につき、同等品への変更でもいい?」みたいな連絡がきつつ、計一週間で代替品が届きました。日本語だと楽ですねー。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20161025/20161025180700.jpg" alt="f:id:miyahan:20161025180700j:plain" title="f:id:miyahan:20161025180700j:plain" class="hatena-fotolife" itemprop="image"></span><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20161025/20161025180706.jpg" alt="f:id:miyahan:20161025180706j:plain" title="f:id:miyahan:20161025180706j:plain" class="hatena-fotolife" itemprop="image"></span></p> <p>さっそく <a class="keyword" href="http://d.hatena.ne.jp/keyword/Mac%20mini">Mac mini</a> に取り付け。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20161025/20161025180758.jpg" alt="f:id:miyahan:20161025180758j:plain" title="f:id:miyahan:20161025180758j:plain" class="hatena-fotolife" itemprop="image"></span></p> <p>それにしても、立て続けに <a class="keyword" href="http://d.hatena.ne.jp/keyword/Mac">Mac</a> が3台故障・・・。<a class="keyword" href="http://d.hatena.ne.jp/keyword/Mac%20Pro">Mac Pro</a> の修理に5万、<a class="keyword" href="http://d.hatena.ne.jp/keyword/iMac">iMac</a> の買い替えに25万。そして <a class="keyword" href="http://d.hatena.ne.jp/keyword/iPad">iPad</a> Pro で 9万、<a class="keyword" href="http://d.hatena.ne.jp/keyword/iPhone%207%20plus">iPhone 7 plus</a> で 10.5万・・・。今年はどんだけアップルに貢いでるんだw</p> miyahan iMac サルベージ中に Mac Pro が故障するの巻 hatenablog://entry/10328749687191201943 2016-10-25T16:14:29+09:00 2018-04-17T16:59:01+09:00 壊れた iMac のデータ吸い出し中に Mac Pro が壊れて AppleCare へ修理に出す話 <h1><a class="keyword" href="http://d.hatena.ne.jp/keyword/iMac">iMac</a> 壊れる</h1> <p>先日、妹が使っている 24インチ <a class="keyword" href="http://d.hatena.ne.jp/keyword/iMac">iMac</a> Early 2009 で<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AB%A1%BC%A5%CD%A5%EB%A5%D1%A5%CB%A5%C3%A5%AF">カーネルパニック</a>が頻発するようになり、まともに使えなくなりました。<a class="keyword" href="http://d.hatena.ne.jp/keyword/fsck">fsck</a> すると修正不可能など<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D5%A5%A1%A5%A4%A5%EB%A5%B7%A5%B9%A5%C6%A5%E0">ファイルシステム</a>の破損が進んでおり、これが原因だと思いました。</p> <p>データは Time Machine で外付けHDDにバックアップしているものの、内蔵HDDをフォーマットしてOS・データを復旧している間に Time Machine が壊れると、妹の全人生のデータが失われてしまうため、綱渡り状態は避けたいところです。<a href="#f-b8327de4" name="fn-b8327de4" title="「そんな偶然が重なるわけないでしょ」と思う方もいるかもしれませんが、バックアップから復旧するということは、普段あまりアクセスしていないHDDから全力で全データを読みにいくことになるため、隠れた故障が顕在化することがよくあります。非常用懐中電灯をいざ使ってみたら、すぐに電球が切れてしまった・電池の残量が無かったみたいなもんです。">*1</a></p> <p>そこで安全のために内蔵HDDのクローンを作成してから再インストールしようと、<a class="keyword" href="http://d.hatena.ne.jp/keyword/iMac">iMac</a> をターゲットディスクモードにしつつ、私の <a class="keyword" href="http://d.hatena.ne.jp/keyword/Mac%20Pro">Mac Pro</a> Mid 2010 に <a class="keyword" href="http://d.hatena.ne.jp/keyword/FireWire">FireWire</a> で接続し <a href="https://www.igeekinc.com/products/datarescue4.html">Data Rescue</a> というソフトでデータの復旧を行いました。</p> <h2><a class="keyword" href="http://d.hatena.ne.jp/keyword/Mac%20Pro">Mac Pro</a> も壊れる</h2> <p>データの吸い出しには数十時間かかるらしいので、<a class="keyword" href="http://d.hatena.ne.jp/keyword/Mac%20Pro">Mac Pro</a> を動かしたまま会社に行ったのですが、帰宅すると電源が落ちていました。</p> <p>え、なんで・・・?と思いながら電源スイッチを押すと・・・ 起動しない・・・</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20161025/20161025144345.gif" alt="f:id:miyahan:20161025144345g:plain" title="f:id:miyahan:20161025144345g:plain" class="hatena-fotolife" itemprop="image"></span></p> <p>よくみると電源ランプが点滅しています。ググってみると、どうやら POST NG を示しているようです。「まあどうせメモリ故障だろう」と気軽な気持ちで切り分け開始。</p> <ol> <li>SMCリセット(<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C5%C5%B8%BB%A5%B1%A1%BC%A5%D6%A5%EB">電源ケーブル</a>を抜いてしばらく放置):NG</li> <li>RAM抜き差し:NG</li> <li>RAM組み替え:NG</li> <li>CPUカード抜き差し:NG</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D3%A5%C7%A5%AA%A5%AB%A1%BC%A5%C9">ビデオカード</a>抜き差し:NG</li> <li>ストレージ(HDD,<a class="keyword" href="http://d.hatena.ne.jp/keyword/SSD">SSD</a>,DVDドライブ)取り外し:NG</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D3%A5%C7%A5%AA%A5%AB%A1%BC%A5%C9">ビデオカード</a>取り外し:NG</li> <li>RAM取り外し:NG</li> </ol> <p>全滅・・・</p> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/DRAM">DRAM</a>を1枚も刺していない状況で事象が変化しない<a href="#f-9d0046b6" name="fn-9d0046b6" title="本来であれば、有効なメモリがない事を示す「1回短く点灯、しばらく消灯」に変化するはず">*2</a>ということは、わりと始めのほうで実行されるであろうメモリテストにすら到達していないということで、つまりはロジックボード(<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%DE%A5%B6%A1%BC%A5%DC%A1%BC%A5%C9">マザーボード</a>)または電源が故障している可能性が濃厚です。</p> <h2><a class="keyword" href="http://d.hatena.ne.jp/keyword/Mac%20Pro">Mac Pro</a> 修理を決意</h2> <p>完全に壊れてしまった <a class="keyword" href="http://d.hatena.ne.jp/keyword/Mac%20Pro">Mac Pro</a>。問題は修理するか買い替えるかという話。買ってから既に5年半が経過しているので十分買い替えてもよい時期ではあるのですが、現行の <a class="keyword" href="http://d.hatena.ne.jp/keyword/Mac%20Pro">Mac Pro</a> は6コアモデルですら50万円オーバー。しかもCPUは2世代も前の <a class="keyword" href="http://d.hatena.ne.jp/keyword/Xeon">Xeon</a> E5 v2 で正直言って魅力ゼロです。さらにこの <a class="keyword" href="http://d.hatena.ne.jp/keyword/Mac%20Pro">Mac Pro</a> は初ボーナスで盛りに盛った 12コア24スレッドモデル。<a class="keyword" href="http://d.hatena.ne.jp/keyword/GPU">GPU</a>の時代遅れ感は否めませんが、CPUパワーは現行の 6core モデルと同等で、まだまだ十分に戦えます。</p> <p>二週間悩んだ末、修理してがんばってもらうことにしました。次の問題はどこに修理に出すかという点ですが、<a class="keyword" href="http://d.hatena.ne.jp/keyword/Mac">Mac</a> の修理方法はざっくり分けて3種類あります。</p> <ul> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/Apple">Apple</a> 純正サービス "<a class="keyword" href="http://d.hatena.ne.jp/keyword/AppleCare">AppleCare</a>" を利用する(宅配業者を使ったセンドバック or <a class="keyword" href="http://d.hatena.ne.jp/keyword/Apple%20Store">Apple Store</a> 持ち込み) <ul> <li>pros : 安心</li> <li>cons : ネジ1本でも5万円の一律料金</li> </ul> </li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/Apple">Apple</a>正規サービスプロバイダに依頼する(<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D3%A5%C3%A5%AF%A5%AB%A5%E1%A5%E9">ビックカメラ</a>等) <ul> <li>ためしに<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D3%A5%C3%A5%AF%A5%AB%A5%E1%A5%E9">ビックカメラ</a>のサイトを見てみると「準備中」のページだらけで料金体系が不明瞭(わざとか?)</li> </ul> </li> <li>非正規の修理サービスを利用する <ul> <li>pros : 安くすむ(かもしれない)</li> <li>cons : 基本的に中古品での共食い整備、修理できない場合も多い</li> </ul> </li> </ul> <p>今回はロジックボード交換になる可能性が高いと判断し、<a class="keyword" href="http://d.hatena.ne.jp/keyword/AppleCare">AppleCare</a> を利用することにしました。</p> <h2><a class="keyword" href="http://d.hatena.ne.jp/keyword/Mac%20Pro">Mac Pro</a> ドナドナされる</h2> <p>さすがに <a class="keyword" href="http://d.hatena.ne.jp/keyword/Mac%20Pro">Mac Pro</a> を担いで電車で銀座に行くのは何なので、センドバック修理にします。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20161025/20161025152031.png" alt="f:id:miyahan:20161025152031p:plain" title="f:id:miyahan:20161025152031p:plain" class="hatena-fotolife" itemprop="image"></span></p> <p>まず、<a class="keyword" href="http://d.hatena.ne.jp/keyword/Apple">Apple</a> の <a href="https://checkcoverage.apple.com/jp/ja/">保証状況の確認</a> ページでシリアルナンバーを入力します。結果が表示されたら "修理のお申し込み" に進み、トラブルの内容を選択します。今回は ハードウェアの問題 → 電源が入らない を選びました。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20161025/20161025152034.png" alt="f:id:miyahan:20161025152034p:plain" title="f:id:miyahan:20161025152034p:plain" class="hatena-fotolife" itemprop="image"></span></p> <p>つぎにサポートの方法を選択します。今回は電話を選びました。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20161025/20161025152259.png" alt="f:id:miyahan:20161025152259p:plain" title="f:id:miyahan:20161025152259p:plain" class="hatena-fotolife" itemprop="image"></span></p> <p>なんと電話1回につき3000円を請求されます!!ここでだいぶ右往左往したのですが、結論を言うと <strong>有償修理の依頼であればサポート料金は不要でした</strong>。そのまま進めると指定した番号に電話がかかってきて、5分くらいでサポートセンタにつながりました。あとは淡々と事象を説明し、回収日や支払い方法決めて修理依頼が完了。ちなみに今回はカード払いにしたのですが、電話終了後、すぐに請求メールが飛んできてアップルのサイトで決済を行いました。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20161025/20161025153231.jpg" alt="f:id:miyahan:20161025153231j:plain" title="f:id:miyahan:20161025153231j:plain" class="hatena-fotolife" itemprop="image"></span></p> <p>デスクの足がジャマで取り出せず、仕方ないのでベランダからお迎えにあがるの図</p> <h2><a class="keyword" href="http://d.hatena.ne.jp/keyword/Mac%20Pro">Mac Pro</a> 帰ってくる</h2> <p>8/31 にピックアップしてもらい、9/2 に修理完了、そして 9/3 に到着。3日間のスピード修理でした。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20161025/20161025153950.png" alt="f:id:miyahan:20161025153950p:plain" title="f:id:miyahan:20161025153950p:plain" class="hatena-fotolife" itemprop="image"></span></p> <p>気になる修理内容ですが、やはりロジックボード不良だったようで丸ごと交換されていました。さらに<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D3%A5%C7%A5%AA%A5%AB%A1%BC%A5%C9">ビデオカード</a>にも故障が内在していたらしく交換されていました。また電話でさりげなく伝えていたドライブベイの振動吸収用のゴムワッシャーが劣化していた件も、ベイの丸ごと交換で対応してもらえていました。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20161025/20161025154359.png" alt="f:id:miyahan:20161025154359p:plain" title="f:id:miyahan:20161025154359p:plain" class="hatena-fotolife" itemprop="image"></span></p> <p>結果的に5万円ペイするだけの価値はあったと思います。まあ正直、<a class="keyword" href="http://d.hatena.ne.jp/keyword/RADEON">RADEON</a> HD 5770 の新品が手には入ってもうれしくも無いですがw</p> <h2><a class="keyword" href="http://d.hatena.ne.jp/keyword/iMac">iMac</a> おまえか?</h2> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/Mac%20Pro">Mac Pro</a> が復活したので、妹 <a class="keyword" href="http://d.hatena.ne.jp/keyword/iMac">iMac</a> のデータ吸い出しを再開しようと <a class="keyword" href="http://d.hatena.ne.jp/keyword/FireWire">FireWire</a> ケーブルを刺した瞬間、<a class="keyword" href="http://d.hatena.ne.jp/keyword/Mac%20Pro">Mac Pro</a> の電源が落ち、うんともすんとも言わなくなりました。慌てて <a class="keyword" href="http://d.hatena.ne.jp/keyword/FireWire">FireWire</a> ケーブルを抜くと、正常に起動するようになりました。</p> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/iMac">iMac</a>、貴様が壊したのか・・・?</p> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/FireWire">FireWire</a> 経由で変な電気が流れて、<a class="keyword" href="http://d.hatena.ne.jp/keyword/Mac%20Pro">Mac Pro</a> のロジックボードが昇天。もともと <a class="keyword" href="http://d.hatena.ne.jp/keyword/FireWire">FireWire</a> は大容量のバスパワーを持っているために壊れやすいと言われているだけに、十分あり得る話です・・・。</p> <p>というわけでデータ吸い出しは中止。代わりに Time Machine 用HDDのクローンを作成し、<a class="keyword" href="http://d.hatena.ne.jp/keyword/iMac">iMac</a> のOS再インストールを行いました。これで治ると思いきや、インストール中に<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AB%A1%BC%A5%CD%A5%EB%A5%D1%A5%CB%A5%C3%A5%AF">カーネルパニック</a>が発生。何度ためしてもダメ。つまり<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D5%A5%A1%A5%A4%A5%EB%A5%B7%A5%B9%A5%C6%A5%E0">ファイルシステム</a>の破損ではなく、ハードウェア故障が原因だったのです。結局、<a class="keyword" href="http://d.hatena.ne.jp/keyword/iMac">iMac</a> のほうは買い替えることにしました。</p> <p>なんだか <a class="keyword" href="http://d.hatena.ne.jp/keyword/iMac">iMac</a> に壊された感が強いオレの <a class="keyword" href="http://d.hatena.ne.jp/keyword/Mac%20Pro">Mac Pro</a>。まあなんだ、これからもよろしく。</p> <h2>余談</h2> <p><a href="https://browser.primatelabs.com/mac-benchmarks">Mac Benchmarks - Geekbench Browser</a> をみると、<a class="keyword" href="http://d.hatena.ne.jp/keyword/Mac%20Pro">Mac Pro</a> Mid 2010 (Dual 6core 2.66GHz) って、<a class="keyword" href="http://d.hatena.ne.jp/keyword/iMac">iMac</a> 特松とどっこいなのね・・・。今使ってるモニタ(<a class="keyword" href="http://d.hatena.ne.jp/keyword/NEC">NEC</a> LCD2690WUXi)もヘタってきて買い替えたいし、ふつうに <a class="keyword" href="http://d.hatena.ne.jp/keyword/iMac">iMac</a> に行った方がよかったかしらw</p> <div class="footnote"> <p class="footnote"><a href="#fn-b8327de4" name="f-b8327de4" class="footnote-number">*1</a><span class="footnote-delimiter">:</span><span class="footnote-text">「そんな偶然が重なるわけないでしょ」と思う方もいるかもしれませんが、バックアップから復旧するということは、普段あまりアクセスしていないHDDから全力で全データを読みにいくことになるため、隠れた故障が顕在化することがよくあります。非常用懐中電灯をいざ使ってみたら、すぐに電球が切れてしまった・電池の残量が無かったみたいなもんです。</span></p> <p class="footnote"><a href="#fn-9d0046b6" name="f-9d0046b6" class="footnote-number">*2</a><span class="footnote-delimiter">:</span><span class="footnote-text">本来であれば、有効なメモリがない事を示す「1回短く点灯、しばらく消灯」に変化するはず</span></p> </div> miyahan ルーターのコンフィグを git にぶち込んで世代管理してみたはなし hatenablog://entry/6653812171398959252 2016-06-01T10:55:15+09:00 2018-09-02T13:44:48+09:00 みんな好き勝手な名前でコンフィグファイルをアップロードしてサーバーがパンク&どれが最新版かわからない状況に...。そこで git で履歴管理をしてみることに。 <h3>この記事を三行で</h3> <ul> <li>みんな好き勝手な名前でコンフィグファイルをアップロードしてサーバーがパンク&どれが最新版かわからない状況に</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%CC%BF%CC%BE%B5%AC%C2%A7">命名規則</a>を作り、サーバーに置いておくコンフィグを最新世代1つのみとした</li> <li>さらにファイルを社内 GitLab に自動アップロードし履歴確認ができるようにした</li> </ul> <p>※ GitLab を入れ物として使うだけで、git を使ったワークフローを導入したとかのカッコイイ話じゃありません</p> <h3>あらまし</h3> <p>とある通信会社の委託でIPネットワークの監視作業員をやっています(非エンジニア)。うちの会社では<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%EB%A1%BC%A5%BF%A1%BC">ルーター</a>・スイッチ類のコンフィグをTFTPサーバーへアップロードしてバックアップとしていますが、先日そのサーバーで反応が5分くらい返ってこなかったり、ファイルのアップロードに失敗したりと動作が不安定に・・・。HDDでも壊れたかな?と思いながら調べてみると...</p> <pre class="code" data-lang="" data-unlink>$ df -h Filesystem サイズ 使用 残り 使用% マウント位置 /dev/cciss/c0d0p3 195G 195G 0 100% / /dev/cciss/c0d0p1 99M 13M 81M 14% /boot</pre> <p>Σ(;゙゚ω゚) ディスクフル!!!!</p> <pre class="code" data-lang="" data-unlink>$ ll /var/tftp/ | wc -l 239662</pre> <p>Σ(;゙゚ω゚) 24万ファイル!!!!</p> <p>この異常なまでの膨大なファイルは、いろんな組織や人間が好き勝手な名前でコンフィグをアップロードしてきたなれの果てです。ホスト1つを取っても、こんな感じでファイルがうじゃうじゃ出てきます。</p> <pre class="code" data-lang="" data-unlink>$ ll /var/tftp | grep tkycore01 -rw-rw-rw- 1 nobody nobody 124862 10月 10 2015 20140303_tkycore01-confg -rw-rw-rw- 1 nobody nobody 127522 10月 10 2015 after_tkycore01.config -rw-rw-rw- 1 nobody nobody 123456 10月 10 2015 before_tkycore01.config -rw-rw-rw- 1 nobody nobody 122899 10月 10 2015 tkycore01 -rw-rw-rw- 1 nobody nobody 123456 10月 10 2015 tkycore01-confg -rw-rw-rw- 1 nobody nobody 126984 10月 10 2015 tkycore01-confg.txt -rw-rw-rw- 1 nobody nobody 119853 10月 10 2015 tkycore01-confg-old -rw-rw-rw- 1 nobody nobody 127556 10月 10 2015 tkycore01-confg_20130712.config -rw-rw-rw- 1 nobody nobody 126574 10月 10 2015 tkycore01-config</pre> <p>しかも以前に行ったサーバーの引っ越し時にタイムスタンプが狂ってしまった(属性のコピーを忘れた)らしく、もはやどれが最新のファイルかわからない状態に・・・。しかもこれが原因で誤って古いコンフィグで設備を復旧させてしまい、通信障害を起こしてしまった事故が何度も起きています。(ちなみに社内では、ヒューマンエラーに起因する障害を "人為故障" と呼ぶ)</p> <h3>対策方針</h3> <p>ふつうなら <a href="http://www.shrubbery.net/rancid/">RANCID</a> あたりで管理すべきところですが、うちの会社は優れた<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AA%A1%BC%A5%D7%A5%F3%A5%BD%A1%BC%A5%B9">オープンソース</a>ソフトウェアを導入したり、ワークフローを大きく変えることに強い抵抗があるため、あくまで従来の暖かみのあるマニュアルオペレーション()を踏襲しつつ、差分管理のみを自動化することにしました。というわけで立てた方針がコチラ。</p> <ol> <li>TFTPサーバーに保存しておくコンフィグは最新世代一つのみとし、ファイル名は <a class="keyword" href="http://d.hatena.ne.jp/keyword/Cisco">Cisco</a> ライクに <code>ホスト名-confg</code> に統一する</li> <li>定期的にTFTPサーバー上の変更されたファイルを 社内GitLab へ自動アップロードし、バックアップ兼ヒストリーとして活用する</li> </ol> <p>これによって、作業者のオペレーションは次のようになります。</p> <p>Before</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20160713/20160713225607.png" alt="f:id:miyahan:20160713225607p:plain" title="f:id:miyahan:20160713225607p:plain" class="hatena-fotolife" itemprop="image"></span></p> <ul> <li>ダウンロード : TFTPサーバーをホスト名で検索し、中身を見比べて最新ファイルを探して取得する = <strong>オペミスの恐れ!!</strong></li> <li>アップロード : 特にルールがなく、上書きしたり、ファイル名に日付をつけたり様々 = <strong>オートメーション化できない</strong></li> </ul> <p>After</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20160714/20160714202657.png" alt="f:id:miyahan:20160714202657p:plain" title="f:id:miyahan:20160714202657p:plain" class="hatena-fotolife" itemprop="image"></span></p> <ul> <li>ダウンロード:<code>ホスト名-confg</code> で取ってくる</li> <li>アップロード:<code>ホスト名-confg</code> で上げる</li> </ul> <p>と、シンプルなオペレーションになりました。</p> <h3>サーバー大掃除</h3> <p>さっそくTFTPサーバー上から不要なファイルを削除し、最新ファイルをリネームしなければならないのですが、どのファイルが最新か調べるのは大変です。さらにディスク溢れのせいか、破損しているファイルもいくつか見つかったため、この際すべて取得し直すことにしました。</p> <p>私が以前作った Telnetter というバッチ実行環境を使い、自担当が管轄している全ホストに <a class="keyword" href="http://d.hatena.ne.jp/keyword/Telnet">Telnet</a> して <code>copy running-config tftp:</code> でTFTPサーバーへ現用コンフィグをアップロードするシナリオファイルを作成して実行。そのあと<a class="keyword" href="http://d.hatena.ne.jp/keyword/%CC%BF%CC%BE%B5%AC%C2%A7">命名規則</a>に則っていないゴミファイルをサーバーから削除。これによって約14万ファイルを削減できました!!</p> <pre class="code" data-lang="" data-unlink>$ ll /var/tftp | grep tkycore01 -rw-rw-rw- 1 nobody nobody 124862 5月 30 00:00 tkycore01-confg</pre> <p>(*´ω`*) すてき</p> <p>ファイルが最新版1つになったことによって、サーバーが軽くなりましたし、コンフィグ復旧時に誤って古いコンフィグをダウンロードしてしまうといったヒューマンエラーも防止することができます。</p> <h3>git を使って履歴管理</h3> <p>ただもしかすると今後、以前のコンフィグを参照したいニーズが出てくるかもしれません。でもここで、またファイル名に日付を付けだしたりすると、せっかくの大掃除が水の泡になってしまいます。よい方法を考えていた矢先、「そうだ、履歴管理といえば<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A1%BC%A5%B8%A5%E7%A5%F3%B4%C9%CD%FD%A5%B7%A5%B9%A5%C6%A5%E0">バージョン管理システム</a>じゃん」と気づき、git を使ってみようと思い立ちました。</p> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A1%BC%A5%B8%A5%E7%A5%F3%B4%C9%CD%FD%A5%B7%A5%B9%A5%C6%A5%E0">バージョン管理システム</a>を使うことで、いわゆる「いつ、だれが、何のために」変更を行ったかを記録できるメリットが得られるのですが、うちの作業員(ノンエンジニア)に git を使ってもらうのは困難なので、定期的に更新されたファイルをリモー<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C8%A5%EA%A5%DD%A5%B8">トリポジ</a>トリ(GitLab)に push させる<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%AF%A5%EA%A5%D7%A5%C8">スクリプト</a>を動かし、今回は GitLab を単なる "時間軸をもった入れ物" として使うことに。</p> <p>私は <a class="keyword" href="http://d.hatena.ne.jp/keyword/PHP">PHP</a> しか書いたことのない<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A4%E6%A4%C8%A4%EA%A4%C1%A4%E3%A4%F3">ゆとりちゃん</a>なのですが、さすがに<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B7%A5%A7%A5%EB%A5%B9%A5%AF%A5%EA%A5%D7%A5%C8">シェルスクリプト</a>的なものを <a class="keyword" href="http://d.hatena.ne.jp/keyword/PHP">PHP</a> で書くのもアレなので、今回人生で初めて <a class="keyword" href="http://d.hatena.ne.jp/keyword/Python">Python</a> を使ってみることにしました。</p> <p>全体の流れは次のとおり</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20160531/20160531061945.png" alt="f:id:miyahan:20160531061945p:plain" title="f:id:miyahan:20160531061945p:plain" class="hatena-fotolife" itemprop="image"></span></p> <ol> <li>TFTPサーバーから <a class="keyword" href="http://d.hatena.ne.jp/keyword/rsync">rsync</a> でファイルを取ってくる</li> <li>ファイル名を解析し、フォルダ分けを行う</li> <li>追加・削除・変更があったファイルを git add / git rm して社内GitLabサーバーへ push</li> </ol> <h4>1. <a class="keyword" href="http://d.hatena.ne.jp/keyword/rsync">rsync</a> でファイルサーバーからファイルを取ってくる</h4> <pre class="code lang-python" data-lang="python" data-unlink>os.chdir(os.path.dirname(os.path.abspath(__file__))+<span class="synConstant">'/'</span>) args = [ <span class="synConstant">'sshpass'</span>, <span class="synConstant">'-p'</span>, rsync_remote_pass, <span class="synConstant">'rsync'</span>, <span class="synConstant">'-auvz'</span>, <span class="synConstant">'--delete'</span>, <span class="synConstant">'--include-from'</span>, <span class="synConstant">'rsync_include.list'</span>, <span class="synConstant">'--exclude'</span>, <span class="synConstant">&quot;*&quot;</span>, rsync_remote_uri, <span class="synConstant">'tftp/'</span> ] subprocess.call(args) </pre> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/python">python</a> から <a class="keyword" href="http://d.hatena.ne.jp/keyword/rsync">rsync</a> コマンドを叩いているだけです。ポイントは次の通り</p> <ul> <li><code>sshpass</code> を使って対話式ログイン処理を省略 <ul> <li><code>expect \"password:\"</code> とかやってる場合じゃない! 参考:<a href="https://qiita.com/koara-local/items/1aec16a4f866844f546d">sshpass&#x3067;ssh/scp&#x306E;&#x5BFE;&#x8A71;&#x578B;&#x306E;&#x30D1;&#x30B9;&#x30EF;&#x30FC;&#x30C9;&#x5165;&#x529B;&#x3092;&#x81EA;&#x52D5;&#x5316;&#x3059;&#x308B; - Qiita</a></li> <li>本当は公開鍵認証方式にしたかったのだけど、サーバー側の<a class="keyword" href="http://d.hatena.ne.jp/keyword/SSHd">SSHd</a>の設定をいじる権限が無いので断念</li> </ul> </li> <li><code>--include-from</code> を使って自担当が管轄する装置のコンフィグファイルだけを転送させる</li> <li><code>--delete</code> オプションを使ってサーバー上のファイルが削除されたら、作業環境のファイルも同期して削除するようにする</li> </ul> <h4>2. ホスト名をもとにフォルダ分け</h4> <p>このまま数万のファイルを git にぶちこんでしまうと、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%EA%A5%DD%A5%B8%A5%C8%A5%EA">リポジトリ</a>が大変なことになってしまうので階層化します。今回はロケーション(<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C5%D4%C6%BB">都道</a>府県名/データセンタービル名)で分けることにしました。</p> <pre class="code lang-python" data-lang="python" data-unlink><span class="synComment"># 既存ファイル一覧を取得 (削除対象フラグとして使う)</span> arealist = [ <span class="synConstant">'tokyo'</span>, <span class="synConstant">'kanagawa'</span>, <span class="synConstant">'chiba'</span>, <span class="synConstant">'saitama'</span>, <span class="synConstant">'ibaraki'</span>, <span class="synConstant">'tochigi'</span>, <span class="synConstant">'gunma'</span>, <span class="synConstant">'yamanashi'</span>, <span class="synConstant">'nagano'</span>, <span class="synConstant">'nigata'</span>, <span class="synConstant">'miyagi'</span>, <span class="synConstant">'fukushima'</span>, <span class="synConstant">'iwate'</span>, <span class="synConstant">'aomori'</span>, <span class="synConstant">'yamagata'</span>, <span class="synConstant">'akita'</span>, <span class="synConstant">'hokkaido'</span> ] old_files = {} <span class="synStatement">for</span> area <span class="synStatement">in</span> arealist: <span class="synStatement">for</span> dirpath, dirnames, filenames <span class="synStatement">in</span> os.walk(area): <span class="synStatement">for</span> <span class="synIdentifier">file</span> <span class="synStatement">in</span> filenames: old_files[<span class="synIdentifier">file</span>] = dirpath+<span class="synConstant">'/'</span>+<span class="synIdentifier">file</span> </pre> <p>まずは分類済みのファイルリストを生成します。これはのちに削除されたファイルの検出に用います。(<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C5%D4%C6%BB">都道</a>府県で会社がバレますな)</p> <pre class="code lang-python" data-lang="python" data-unlink><span class="synComment"># TFTPディレクトリから一覧を取得、ファイル名解析しビルごとのディレクトリへコピー</span> pattern = <span class="synConstant">r&quot;^(secret)$&quot;</span> host_re = re.<span class="synIdentifier">compile</span>(pattern) <span class="synStatement">for</span> <span class="synIdentifier">file</span> <span class="synStatement">in</span> os.listdir(<span class="synConstant">'tftp'</span>): <span class="synComment"># ファイル名解析</span> match = host_re.search(<span class="synIdentifier">file</span>) <span class="synStatement">if</span> match <span class="synStatement">is</span> <span class="synIdentifier">None</span>: <span class="synIdentifier">print</span>(<span class="synConstant">'</span><span class="synSpecial">\033</span><span class="synConstant">[91m**WARNING**</span><span class="synSpecial">\033</span><span class="synConstant">[0m Invalid filename format : '</span>+<span class="synIdentifier">file</span>) <span class="synStatement">continue</span> bldg = match.group(<span class="synConstant">2</span>) area = areacode[match.group(<span class="synConstant">3</span>)] src = <span class="synConstant">'tftp/'</span>+<span class="synIdentifier">file</span> dst = area+<span class="synConstant">'/'</span>+bldg+<span class="synConstant">'/'</span> <span class="synComment"># 削除フラグを消す</span> <span class="synStatement">if</span> <span class="synIdentifier">file</span> <span class="synStatement">in</span> old_files: old_files.pop(<span class="synIdentifier">file</span>) <span class="synComment"># すでに同じファイルがある場合はスキップ</span> <span class="synStatement">if</span> os.path.isfile(dst+<span class="synConstant">'/'</span>+<span class="synIdentifier">file</span>) <span class="synStatement">and</span> filecmp.<span class="synIdentifier">cmp</span>(src, dst+<span class="synConstant">'/'</span>+<span class="synIdentifier">file</span>): <span class="synStatement">continue</span> <span class="synComment"># コピー先ディレクトリが無ければ作成</span> <span class="synStatement">if</span> <span class="synStatement">not</span> os.path.isdir(dst): os.makedirs(dst) <span class="synComment"># ファイルをビルディレクトリへコピー</span> shutil.copy2(src, dst) args = [<span class="synConstant">'git'</span>, <span class="synConstant">'add'</span>, dst+<span class="synConstant">'/'</span>+<span class="synIdentifier">file</span>] subprocess.call(args) </pre> <p>つぎにさきほど <a class="keyword" href="http://d.hatena.ne.jp/keyword/rsync">rsync</a> で取ってきたファイルに対し、ファイル名を<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C0%B5%B5%AC%C9%BD%B8%BD">正規表現</a>で解析して適切な<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C7%A5%A3%A5%EC%A5%AF%A5%C8">ディレクト</a>リへコピーしします。</p> <pre class="code lang-python" data-lang="python" data-unlink><span class="synComment"># TFTPディレクトリから無くなったファイルを削除</span> <span class="synStatement">for</span> path <span class="synStatement">in</span> old_files.values(): args = [<span class="synConstant">'git'</span>, <span class="synConstant">'rm'</span>, path] subprocess.call(args) <span class="synIdentifier">print</span>(<span class="synConstant">'Removed deleted file: '</span>+path) </pre> <p>ファイルの走査が終わった後も分類済みファイルリストに残っているファイルは、オリジナルのTFTPサーバーに存在しない、すなわち削除されたファイルなので、<code>git rm</code> で分類先<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C7%A5%A3%A5%EC%A5%AF%A5%C8">ディレクト</a>リから削除します</p> <h4>3. git push</h4> <pre class="code lang-python" data-lang="python" data-unlink>d = datetime.datetime.today() today = <span class="synConstant">'%s/%s/%s'</span> % (d.year, d.month, d.day) args = [<span class="synConstant">'git'</span>, <span class="synConstant">'commit'</span>, <span class="synConstant">'-m'</span>, <span class="synConstant">'auto backup at '</span>+today] subprocess.call(args) args = [<span class="synConstant">'git'</span>, <span class="synConstant">'push'</span>, <span class="synConstant">'-u'</span>, <span class="synConstant">'origin'</span>, <span class="synConstant">'master'</span>] subprocess.call(args) </pre> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/python">python</a> から git コマンドをコールし、社内 GitLab サーバへ push します。</p> <p>この<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%AF%A5%EA%A5%D7%A5%C8">スクリプト</a>を1日1回動かし、その日に変更されたファイルを自動で GitLab へ push するようにしました。</p> <h3>git を使ったコンフィグ履歴確認</h3> <p>その結果、こんな感じでWebブラウザからコンフィグの閲覧や差分の確認ができるようになりました。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20160531/20160531014639.png" alt="f:id:miyahan:20160531014639p:plain" title="f:id:miyahan:20160531014639p:plain" class="hatena-fotolife" itemprop="image"></span> <span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20160531/20160531014648.png" alt="f:id:miyahan:20160531014648p:plain" title="f:id:miyahan:20160531014648p:plain" class="hatena-fotolife" itemprop="image"></span></p> <p>また、git コマンドを使えばさらに高度な操作ができます。</p> <ul> <li>特定ホストのコンフィグ変更履歴をみたい : <code>git log &lt;ファイルパス&gt;</code> <span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20160605/20160605185659.png" alt="f:id:miyahan:20160605185659p:plain" title="f:id:miyahan:20160605185659p:plain" class="hatena-fotolife" itemprop="image"></span></li> <li>特定ホストの過去のコンフィグと現在のコンフィグを比較したい : <code>git diff &lt;コミットID&gt; &lt;コミットID&gt; &lt;ファイルパス&gt;</code> <span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20160605/20160605185654.png" alt="f:id:miyahan:20160605185654p:plain" title="f:id:miyahan:20160605185654p:plain" class="hatena-fotolife" itemprop="image"></span></li> <li>特定の期間にコンフィグが変更されたホスト一覧を調べたい : <code>git log --since=&lt;開始日時&gt; --until=&lt;終了日時&gt;</code> <span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20160605/20160605185658.png" alt="f:id:miyahan:20160605185658p:plain" title="f:id:miyahan:20160605185658p:plain" class="hatena-fotolife" itemprop="image"></span></li> </ul> <p>ほんと git は何でもできますね。恐るべし!</p> <h3>今後やりたいこと</h3> <ul> <li>えらい人に本施策の正式な許可をもらう(もらってないのかよ!)</li> <li>他部署も巻き込んでコンフィグの管理ルール・<a class="keyword" href="http://d.hatena.ne.jp/keyword/%CC%BF%CC%BE%B5%AC%C2%A7">命名規則</a>を決め標準化する</li> <li>ゆくゆくは作業者に git を使ってもらう</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%EB%A1%BC%A5%BF%A1%BC">ルーター</a>内の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D5%A5%E9%A5%C3%A5%B7%A5%E5%A5%E1%A5%E2%A5%EA">フラッシュメモリ</a>カードも同様にぐちゃぐちゃになっているので対策したい</li> <li>サーバーがディスクフルなのを誰も気づいてなかったので監視ツール入れたい(私の管轄じゃないけど)</li> </ul> <h3>余談 | <a class="keyword" href="http://d.hatena.ne.jp/keyword/Python">Python</a> 初体験の感想</h3> <p>結論:ググればなんとかなった</p> <ul> <li>変なことが起きたらとりあえず例外を投げてくれるので、<a class="keyword" href="http://d.hatena.ne.jp/keyword/PHP">PHP</a> でありがちな「何も言わずに落ちた」・「正常に終わったと見せかけて、正常に終わってない」ということが起きにくい</li> <li>ネストの <code>{}</code> や文末の <code>;</code>、変数の <code>$</code> など、<a class="keyword" href="http://d.hatena.ne.jp/keyword/PHP">PHP</a> と比べて記号が少なく全体的にすっきりしている</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/Python">Python</a> のリスト(配列)の検索はめちゃくちゃ遅い。<a class="keyword" href="http://d.hatena.ne.jp/keyword/PHP">PHP</a>の「とりあえず<a class="keyword" href="http://d.hatena.ne.jp/keyword/%CF%A2%C1%DB%C7%DB%CE%F3">連想配列</a>にぶち込む」的なノリで使ったら痛い目に遭った。<a class="keyword" href="http://d.hatena.ne.jp/keyword/Python">Python</a> で配列を検索するなら辞書かセットを使ってキーを検索する(ハッシュ照合なので速い)</li> <li>今回<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C7%A5%A3%A5%EC%A5%AF%A5%C8">ディレクト</a>リ一覧の取得やファイルのコピーなど<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D5%A5%A1%A5%A4%A5%EB%A5%B7%A5%B9%A5%C6%A5%E0">ファイルシステム</a>まわりの操作を多用したが、<a class="keyword" href="http://d.hatena.ne.jp/keyword/PHP">PHP</a> よりかゆいところに手が届く感</li> <li><code>subprocess.call</code> が引数を自動で<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A8%A5%B9">エス</a>ケープしてくれることに驚き。(<a class="keyword" href="http://d.hatena.ne.jp/keyword/PHP">PHP</a>だと自分でやらないとOSコマンドインジェクションが容易に行えてしまう)</li> <li>文字列の連結で、どうしても <a class="keyword" href="http://d.hatena.ne.jp/keyword/PHP">PHP</a> 式の <code>foo.bar</code> 表記にしてしまい毎回怒られてしまう(慣れてくると、今度は <a class="keyword" href="http://d.hatena.ne.jp/keyword/PHP">PHP</a> で <code>foo+bar</code> って書いちゃうんだろうな・・・)</li> </ul> <p>典型的な食わず嫌いでした。</p> <h3>後日談</h3> <p>後日、説明資料を作って本社の管理部門の方とお話したのですが、「ギットとかよくわかんないし、組織間で協議してルール作るのもめんどくさいので、これまで通り好きな名前でどんどんアップロードしてくれ」とやんわり全面却下されました。</p> <p>たくさんファイルが作られることで、またサーバーが重くなったり、ヒューマンエラーが起きてしまうリスクについては「課題としては認識している(が対応はしない)」とのことです。</p> <p>(´-`)</p> <h3>さらに後日談</h3> <p>ルールを決めてもやっぱり誤った<a class="keyword" href="http://d.hatena.ne.jp/keyword/%CC%BF%CC%BE%B5%AC%C2%A7">命名規則</a>でコンフィグをアップロードする人や、違う<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C7%A5%A3%A5%EC%A5%AF%A5%C8">ディレクト</a>リにアップロードする人が後を絶たなかったため、全ファイルを定期的にチェックしてチャット(Mattermost)にアラートをあげるように改良しました。</p> <p><blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">コンフィグ置き場を定期的にチェックして、異常を見つけたらチャットに通知するようにした。チャットからもHubot経由で実行できる。まるでIT企業😍 <a href="https://t.co/v5ArlvdJsW">pic.twitter.com/v5ArlvdJsW</a></p>&mdash; Miyahan (@miyahancom) <a href="https://twitter.com/miyahancom/status/822383439546499075?ref_src=twsrc%5Etfw">2017年1月20日</a></blockquote><script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script></p> <p>やっぱりここを自動化しないとダメだよなぁ・・・。</p> <hr /> <p>本記事では「いらすとや」さんのイラストを使わせていただきました。</p> <p><a href="https://www.irasutoya.com/">&#x304B;&#x308F;&#x3044;&#x3044;&#x30D5;&#x30EA;&#x30FC;&#x7D20;&#x6750;&#x96C6; &#x3044;&#x3089;&#x3059;&#x3068;&#x3084;</a></p> <hr /> <ul> <li>2016/6/10 : 新規ファイルがあるとファイル比較時にエラーで止まるバグがあったのでコード修正 <ul> <li>-<code>if filecmp.cmp(src, dst+'/'+file):</code></li> <li>+<code>if os.path.isfile(dst+'/'+file) and filecmp.cmp(src, dst+'/'+file):</code></li> </ul> </li> </ul> miyahan 9.7インチ iPad Pro ディスプレイレビュー hatenablog://entry/10328537792369755868 2016-04-04T18:34:50+09:00 2016-10-25T14:21:31+09:00 9.7インチ iPad Pro のディスプレイの実力を分光測色器を用いてレビュー。True Tone の実力は? Night Shift でブルーカット低減されるのか? <p>こんにちは、miyahan.com のミヤハンです。このたび私のブログ "miyalog" を<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A4%CF%A4%C6%A4%CA%A5%D6%A5%ED%A5%B0">はてなブログ</a>へ引っ越しいたしました。今後ともよろしくお願いします。(いろいろ理由はあるけど、<a class="keyword" href="http://d.hatena.ne.jp/keyword/markdown">markdown</a> でブログ書きたかったってのが一番大きい)</p> <h3><a class="keyword" href="http://d.hatena.ne.jp/keyword/iPad">iPad</a> Pro がやってきた</h3> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20160404/20160404160316.jpg" alt="f:id:miyahan:20160404160316j:plain" title="f:id:miyahan:20160404160316j:plain" class="hatena-fotolife" itemprop="image"></span></p> <p>実はいままで使っていた<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%BF%A5%D6%A5%EC%A5%C3%A5%C8">タブレット</a>がなんと <a class="keyword" href="http://d.hatena.ne.jp/keyword/iPad%202">iPad 2</a> でして、<a class="keyword" href="http://d.hatena.ne.jp/keyword/IOS">IOS</a>バージョンアップのたびに動作がもっさりになっていき、とうとう日本語入力すらままならない状況に陥っていました。<a class="keyword" href="http://d.hatena.ne.jp/keyword/iPad">iPad</a> <a class="keyword" href="http://d.hatena.ne.jp/keyword/Air">Air</a> 3 のおあずけを食らい日々枕を涙で濡らす毎日でしたが、待ちに待った <a class="keyword" href="http://d.hatena.ne.jp/keyword/iPad">iPad</a> Pro 9.7" の発表に即日ばいなう。待ち焦がれた1年間に比べれば、RAMが少し少なかったりカメラがもっこりしていることなど些細な問題です。</p> <p>すでに <a class="keyword" href="http://d.hatena.ne.jp/keyword/iPad">iPad</a> のレビューなど何百、何千とあるでしょうから、本記事では <a class="keyword" href="http://d.hatena.ne.jp/keyword/iPad">iPad</a> Pro で刷新されたディスプレイに焦点を当て、データを交えて語りたいと思います。</p> <h3><a class="keyword" href="http://d.hatena.ne.jp/keyword/iPad">iPad</a> Pro 9.7” ディスプレイ性能検証</h3> <p>"Pro Display" と称したディスプレイは、<a class="keyword" href="http://d.hatena.ne.jp/keyword/iPad">iPad</a> <a class="keyword" href="http://d.hatena.ne.jp/keyword/Air">Air</a> 2 と比べ輝度(ブライトネス)が25%、色域(カラーガマット)が25%向上しており、グレア(外光の映り込み)を40%低減しているとのことです。</p> <p>まずグレアについては、<strong>画面に映り込む照明のシルエットが明らかに薄くなっており</strong>低反射コーティングが進化していることが見て取れます。ただ私の場合は液晶保護シートを貼ってしまったので、この恩恵は受けられません。ごめんねフィル。</p> <p>次に輝度・色域について、x-rite の分光測色計 "ColorMunki" を使って、そのポテンシャルを測定しました。条件は次の通りです</p> <ul> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/iPad%202">iPad 2</a> <ul> <li>明るさ : 最大</li> <li>明るさの自動調整 : OFF</li> </ul> </li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/iPad">iPad</a> Pro 9.7" <ul> <li>明るさ : 最大</li> <li>明るさの自動調整 : OFF</li> <li>True Tone : OFF</li> <li>Night Shift : OFF</li> </ul> </li> </ul> <h4>輝度・<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B3%A5%F3%A5%C8%A5%E9">コントラ</a>スト比・<a class="keyword" href="http://d.hatena.ne.jp/keyword/%BF%A7%B2%B9%C5%D9">色温度</a></h4> <table> <thead> <tr> <th style="text-align:left;"> </th> <th style="text-align:right;"> <a class="keyword" href="http://d.hatena.ne.jp/keyword/iPad%202">iPad 2</a> </th> <th style="text-align:right;"> <a class="keyword" href="http://d.hatena.ne.jp/keyword/iPad">iPad</a> Pro 9.7" </th> </tr> </thead> <tbody> <tr> <td style="text-align:left;"> 最大輝度 </td> <td style="text-align:right;"> 380cd/m<sup>2</sup> </td> <td style="text-align:right;"> 470cd/m<sup>2</sup> </td> </tr> <tr> <td style="text-align:left;"> 黒レベル </td> <td style="text-align:right;"> 0.48cd/m<sup>2</sup> </td> <td style="text-align:right;"> 0.51cd/m<sup>2</sup> </td> </tr> <tr> <td style="text-align:left;"> <a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B3%A5%F3%A5%C8%A5%E9">コントラ</a>スト比 </td> <td style="text-align:right;"> 800:1 </td> <td style="text-align:right;"> 920:1 </td> </tr> <tr> <td style="text-align:left;"> <a class="keyword" href="http://d.hatena.ne.jp/keyword/%BF%A7%B2%B9%C5%D9">色温度</a> </td> <td style="text-align:right;"> 6700K </td> <td style="text-align:right;"> 6650K </td> </tr> <tr> <td style="text-align:left;"> <a class="keyword" href="http://d.hatena.ne.jp/keyword/%BF%A7%B2%B9%C5%D9">色温度</a> Δuv </td> <td style="text-align:right;"> 0.0038 </td> <td style="text-align:right;"> 0.0003 </td> </tr> </tbody> </table> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/iPad">iPad</a> Pro 9.7" は <strong>明るさが <a class="keyword" href="http://d.hatena.ne.jp/keyword/iPad%202">iPad 2</a> と比べ24%ほどアップ</strong>しています。なお、<a href="http://www.itmedia.co.jp/pcuser/articles/1204/03/news102.html">ITmedia “新しいiPad”を正しい色の液晶ディスプレイと見比べる</a> を見るに、私の <a class="keyword" href="http://d.hatena.ne.jp/keyword/iPad%202">iPad 2</a> はかなり明るい個体のようです。<a class="keyword" href="http://d.hatena.ne.jp/keyword/iPad%202">iPad 2</a> が 350cd/m<sup>2</sup>、<a class="keyword" href="http://d.hatena.ne.jp/keyword/iPad">iPad</a> 3 〜 <a class="keyword" href="http://d.hatena.ne.jp/keyword/Air">Air</a> 2 が 420cd/m<sup>2</sup> となると順当な進化と言えるでしょう。</p> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B3%A5%F3%A5%C8%A5%E9">コントラ</a>スト比は 800:1 から 920:1 と少し向上していますが測定誤差な気もします。また<a class="keyword" href="http://d.hatena.ne.jp/keyword/%BF%A7%B2%B9%C5%D9">色温度</a>はどちらも 6700K 前後と、標準規格の 6500K よりわずかに高め(青め)となっています。</p> <h4>色域</h4> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20160404/20160404162500.png" alt="f:id:miyahan:20160404162500p:plain" title="f:id:miyahan:20160404162500p:plain" class="hatena-fotolife" itemprop="image"></span><br/> <a class="keyword" href="http://d.hatena.ne.jp/keyword/iPad%202">iPad 2</a> and <a class="keyword" href="http://d.hatena.ne.jp/keyword/iPad">iPad</a> Pro 9.7" Color Gamut (グレイ部分が sRGB)</p> <p>次に色域ですが、見ての通り大幅に向上しています。<a href="http://www.itmedia.co.jp/pcuser/articles/1204/03/news102.html">ITmedia “新しいiPad”を正しい色の液晶ディスプレイと見比べる</a> を見ると、<a class="keyword" href="http://d.hatena.ne.jp/keyword/iPad%202">iPad 2</a> → <a class="keyword" href="http://d.hatena.ne.jp/keyword/iPad">iPad</a> 3 のときに色域が大幅に広がり、今回さらにグリーンの色純度が高くなり<strong>ほぼ sRGB をカバー</strong>するようになったようです。それにしても疑似<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C7%F2%BF%A7LED">白色LED</a>は赤の発色が苦手なのですが、<strong>ここまで鮮烈な赤色を表現できるというのは驚き</strong>です。</p> <p>というわけで、<a class="keyword" href="http://d.hatena.ne.jp/keyword/iPad%202">iPad 2</a> からは飛躍的なスペックアップを果たしたものの、キーノートでの「従来機種より輝度・色域が25%向上」という発言には疑問が残ります。</p> <h4>画像比較</h4> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20160404/20160404160311.jpg" alt="f:id:miyahan:20160404160311j:plain" title="f:id:miyahan:20160404160311j:plain" class="hatena-fotolife" itemprop="image"></span></p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20160404/20160404160307.jpg" alt="f:id:miyahan:20160404160307j:plain" title="f:id:miyahan:20160404160307j:plain" class="hatena-fotolife" itemprop="image"></span></p> <p>ご覧の通り、色の表現力が格段に向上しています。</p> <h3>True Tone 感想</h3> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/iPad">iPad</a> Pro の 9.7インチ版にかない "True Tone ディスプレイ" 機能は4つの環境光センサを使い、まわりの環境に合わせてディスプレイの明るさ・<a class="keyword" href="http://d.hatena.ne.jp/keyword/%BF%A7%B2%B9%C5%D9">色温度</a>を自動調整してくれる機能です。</p> <p>我が家は各部屋・キッチン・玄関を 5000K (昼白色)、居間・洗面所を 3000K (電球色) にしていますが、<a class="keyword" href="http://d.hatena.ne.jp/keyword/iPad">iPad</a> を持って各部屋を移動すると、目が環境に適応していくように明るさや色が「じわ〜」っと変化していきます。具体的には</p> <ul> <li>True Tone オフ : 6800K</li> <li>昼白色(5000K) : 6200K</li> <li>電球色(3000K) : 5800K</li> </ul> <p>となり環境光に対して一見控えめな変化になっていますが、この繊細で絶妙な調整により<strong>自然な色合いを長時間楽しむことができます</strong>。</p> <h3>Night Shift 感想</h3> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/iOS">iOS</a> 9.3 で導入された "Night Shift" は、近年問題になっている<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D6%A5%EB%A1%BC%A5%E9%A5%A4%A5%C8">ブルーライト</a>による体内時計の狂い・<a class="keyword" href="http://d.hatena.ne.jp/keyword/%BF%E7%CC%B2%BE%E3%B3%B2">睡眠障害</a>に対するアップルの提案です。日の入りとともにディスプレイの<a class="keyword" href="http://d.hatena.ne.jp/keyword/%BF%A7%B2%B9%C5%D9">色温度</a>を下げ、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D6%A5%EB%A1%BC%A5%E9%A5%A4%A5%C8">ブルーライト</a>をカットし良質な眠りに導くとのことです。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20160405/20160405221104.png" alt="f:id:miyahan:20160405221104p:plain" title="f:id:miyahan:20160405221104p:plain" class="hatena-fotolife" itemprop="image"></span> <span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20160405/20160405221243.png" alt="f:id:miyahan:20160405221243p:plain" title="f:id:miyahan:20160405221243p:plain" class="hatena-fotolife" itemprop="image"></span><br/> 波長スペクトル [nm]</p> <p>スペクトル測定の結果、Night Shift 機能により波長500nm以下のいわゆる<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D6%A5%EB%A1%BC%A5%E9%A5%A4%A5%C8">ブルーライト</a>成分が大幅に軽減されていることがわかります。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/miyahan/20160404/20160404181737.jpg" alt="f:id:miyahan:20160404181737j:plain" title="f:id:miyahan:20160404181737j:plain" class="hatena-fotolife" itemprop="image"></span><br/> <a class="keyword" href="http://d.hatena.ne.jp/keyword/iPad">iPad</a> Pro 9.7" with Night Shift (電球環境下)</p> <p>Night Shift は欧米の電球で優しく照らされたベッドルームでは違和感なく使えるのですが、青白い蛍光灯で部屋全体をピカピカに照らされた部屋では「いきなり液晶の色がおかしくなった。故障!?」と激しい違和感を感じるでしょう。<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D6%A5%EB%A1%BC%A5%E9%A5%A4%A5%C8">ブルーライト</a>大好きな日本ではヘタすると「尿液晶機能」などと罵られるかもしれませんね・・・。まあ、先進国向けの機能ですので、気にくわなければ使わなければ良いだけのことです。</p> <p>私はベッドの照明を電球色のLEDにしているので活用していきたいと思います。また日の入り時間ではなく任意の時刻にも設定できるので、就寝時間にセットして「画面が暖色になったら寝なさい」というサインにするのもアリだと思います。</p> <h3>さいごに</h3> <p>今回、<a class="keyword" href="http://d.hatena.ne.jp/keyword/iPad%202">iPad 2</a> から <a class="keyword" href="http://d.hatena.ne.jp/keyword/iPad">iPad</a> Pro 9.7" とタイムスリップを果たしたわけですが、2つの <a class="keyword" href="http://d.hatena.ne.jp/keyword/iPad">iPad</a> を比べることで <a class="keyword" href="http://d.hatena.ne.jp/keyword/iPad">iPad</a> Pro の完成度の高さ、そして同時に <a class="keyword" href="http://d.hatena.ne.jp/keyword/iPad%202">iPad 2</a> の完成度の高さも実感することができました。<a class="keyword" href="http://d.hatena.ne.jp/keyword/iPad%202">iPad 2</a> でアップルが示した<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%BF%A5%D6%A5%EC%A5%C3%A5%C8">タブレット</a>のあり方は既に完成しており、<a class="keyword" href="http://d.hatena.ne.jp/keyword/iPad">iPad</a> Pro ではそれを高め、より高品位で快適なユーザー体験を享受することができるようになりました。</p> <p>「正直ほぼ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%BF%B2%A5%E2%A5%D0">寝モバ</a>専用機だし、わざわざ Pro にすること無かったかなー」と思っていましたが、すべてがストレス無くキビキビ動き、画面はきれいで疲れにくく、内蔵スピーカーの音も格段によくなった。指を置くだけだけロックが解除できる Touch ID もものすごく便利。そして軽くて薄い(細い)と大満足な買い換えになりました。スペック不足でできなかった <a class="keyword" href="http://d.hatena.ne.jp/keyword/iOS">iOS</a>版ドラゴンクエストXIII を購入しプレイする今日この頃です。</p> <h3>document control</h3> <ul> <li>2016/4/4 : 初版</li> <li>2016/4/5 : データが不正確だったため再測定、波長スペクトルグラフを追加</li> </ul> miyahan