12月 09, 2019

換気、足りてますか?

わたしは季節に関係なく頭が痛くなったりする事があるのですが、そういうときは大抵乾燥が酷いときだったりします。部屋にぶら下がっている湿度計を見ると50%を下回っていて、慌てて加湿機を動かします。

冬場になると、 加湿をしても効果が無いときがあり、他になにがあるだろうかと考えたところ、換気が足りていないのではないかというのを思い出しました。
しかし、息苦しいとか頭がクラクラするとかいうのは感じたことがありません。実際にどのくらい換気が足りていないのか、測ってみないことには分からないということで、arduinoとCO2センサーを組み合わせて測ってみました。

使った部品は、arduino unoと、CO2センサー「MH-Z14A」、気温湿度気圧センサー「BME280」です。



結線とソースコードはググったら出てくるでしょう。
CO2センサーはMH-Z19が欲しかったのですが、Amazonでもどこも海外発送ばかりで、到着まで2週間掛かるということだったので、国内のAmazon倉庫から発送できると書かれていたMH-Z14Aにしました。

arduinoのEthernetライブラリを使って自宅のサーバに計測値を投げてファイルに保存し、zabbixからファイルを読み取るという仕組みにしています。2000ppmをトリガーにして、Slackへ通知を送信。
少しはまった部分としては、計測値を投げる処理を1分に一回にすると、なぜか処理が止まってしまうため、30秒に一回にしています。keepaliveあたりのなにかなのか、調べ切れていません。


二酸化炭素濃度は、自然界でだいたい400ppm、よく換気されている部屋で1000ppm以下、2000ppmからは換気が必要だそうです。
実際「建築物における衛生的環境の確保に関する法律」でも1000ppm以下にすることが求められています。

実際に測ってみて分かったこととしては、意外と簡単に2000ppmに達するということです。
私が普段作業をしている部屋は、 14畳ほどの広さのリビング・ダイニング・キッチン一室。古い建物で、外の風が強いときなどはドアの下から風が入ってきて寒いぐらいなのですが、穏やかな天気の時は意外と密封度は高いらしいです。

冬場は、この部屋で小型のガスファンヒーターをつけています。6畳用だったか、8畳用だったか忘れてしまいましたが、能力からすると不足気味の機械なのですが、2時間ぐらいで400ppmから2000ppmぐらいまで上がります。

冒頭で頭がクラクラしないなんて書きましたが、もっと高い濃度で発生するもので、それより前に作業の能力などにも影響が出てくるそうです。
よく見かける注意書きも、死亡事故なんていうぐらいだから「うっ、苦しい」みたいなことになるレベルを想定してしまいますが、じわじわと身体を蝕んで気が付いたときには手遅れということにならないよう、早め早めの換気が必要ですね。


1月30日 追記
arduino用ユニバーサル基板を買ってきて、組み立ててみました。
EthernetシールドのLAN端子がかなり大きくて、基板を切る必要がありましたが、これでブレッドボードと違って蹴飛ばしても配線が外れる心配が無くなりました。






12月 08, 2019

notestock機能追加(追記機能)

いつも応援ありがとうございます。
今回はnotestock( https://notestock.osa-p.net )に機能追加を行ったのでお知らせです。

  • 追記機能が付きました
    例えば「タグを付け忘れて投稿した」とか「表記揺れがあって検索に引っかけにくい」「誤字で投稿したので検索に引っかからないけど、反応が良くて消すのが忍びない」みたいなときに、タグなどを追記しておくと、検索で引っかけられるようになります。


    またこれは共有(いわゆるboostやrenote)に対しても付けることができ、他人の投稿に自分だけのわかりやすいタグを付けておくなんて事も可能です。

    投稿主の追記は、共有先からでも検索可能ですが、共有先の追記は共有した人だけが使えます。
    これは追記も表示・検索対象としていて、共有先の追記も共有元へ反映してしまうと、何でもありの状態になってしまうためです。いろいろ悪い方向にも使えてしまうので、ひとまず一旦は無しにしています。

notestockの公開検索対象や各種検索サービスで、notestockが含まれている投稿をときどき確認していますので、何かあれば投稿しておいてもらえると、反応したりしなかったりします。
よろしくお願いします。

 

11月 01, 2019

mastodon issue 用テスト投稿1

https://github.com/tootsuite/mastodon/issues/15281#issue-757923523
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿

mastodon issue 用テスト投稿2

https://github.com/tootsuite/mastodon/issues/15281#issue-757923523
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿

mastodon issue 用テスト投稿3

https://github.com/tootsuite/mastodon/issues/15281#issue-757923523
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿

mastodon issue 用テスト投稿4

https://github.com/tootsuite/mastodon/issues/15281#issue-757923523
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿
テスト投稿

7月 12, 2019

notestock機能追加(ワードクラウド追加、前・次年の今日リンク、分散SNSからのリンクスクリプト)

いつも応援ありがとうございます。
notestock( https://notestock.osa-p.net )に機能追加を行ったのでお知らせです。

  • ワードクラウドが追加されました!
    投稿している文章を単語ごとに分割し、どんな言葉をよく投稿しているか、文字の大きさで表示するというものです。
    分析というほど大袈裟なものではなく、やっぱりこの言葉をよく投稿しているよね、と改めて認識して楽しむという感じのものです。


  • 「前の日」「次の日」リンクの他に「前の年」「次の年」リンクも表示
    ログインしているときに見られるプライベートページ限定ですが、表示している日の「前の日」「次の日」リンクの他に「前の年」「次の年」リンクも表示されるようになりました。
    前の年にどんな投稿をしていたのか、振り返りやすくなります。
    公開ページには追加していません。公開ページでもカレンダーを選べば見られるといえば見られるのですが、あまりアクセスし易くなりすぎるのもどうかなという思いが少しあって、追加を見送っています。
    検索によって求められた投稿に辿り着くのと、無闇矢鱈と掘り返されるのは、なんとなく違うかなというところでの考えです。この辺り、個人的にもフラフラしているところなので、あっさり追加しちゃうか、なんか設定で選べるようにするかになるかもしれません。

  • マストドンの画面からnotestockへリンクを張るGreasemonkeyスクリプトがMisskeyにも対応
    https://github.com/osapon/distsns2notestock
    このGreasemonkeyスクリプトを入れていると、notestockで公開しているユーザーのマストドンやMisskeyのページを開いたとき、ユーザーのプロフィールや、単独の投稿ページからnotestockへのリンクが表示されます。

notestockの公開検索対象やtootsearchあたりで、notestockが含まれている投稿をときどき確認していますので、何かあれば投稿しておいてもらえると、反応したりしなかったりします。
よろしくお願いします。

 

5月 10, 2019

notestock機能追加(ロゴ追加、ダウンロード、マストドンからのリンクスクリプト)

いつも応援ありがとうございます。
今回はnotestock( https://notestock.osa-p.net )に機能追加を行ったのでお知らせです。

  • ロゴが追加されました!
    いまいち何を表しているのか分かり難いかもしれませんが、1つのアカウントで日記帳のように色々なことを雑多に書いたり、複数のアカウントにバラバラに書いたりされたSNSの情報を、なんとなく整理して表示しようというようなイメージです。
    ふんわりしたニュアンスから、かつとさん( https://pawoo.net/@kat_cloudair )に作っていただきました。

  • ダウンロード機能が追加されました
    notestockに溜め込んだログをダウンロードすることで、自分で複雑な検索をすることも可能ですし、もしnotestockが運営できなくなってしまうようなときにも、データを手元に保管することが可能です。

  • マストドンの画面で動作するGreasemonkeyスクリプトを作成しました
    https://github.com/osapon/mastodon2notestock
    これを使うと、notestockで公開しているユーザーのマストドンページを開いたとき、ユーザーのプロフィールや、単独の投稿ページからnotestockへのリンクが表示されます。
    特に単独ページからのリンクは、notestockで時系列表示のページへ繋がるため、話の流れが分かりやすくなると思います。
    ぜひご利用ください。


notestockの公開検索対象で、notestockが含まれている投稿をときどき確認していますので、何かあれば投稿しておいてもらえると、反応したりしなかったりします。
よろしくお願いします。


3月 08, 2019

notestock機能追加(二要素認証、Webhook機能)

いつも応援ありがとうございます。
今回はnotestock( https://notestock.osa-p.net )に少し機能追加を行ったのでお知らせです。

  • 二要素認証の設定が追加されました
    これは最近よく見かけるかと思いますが、ログイン時にアカウント名とパスワード以外に、スマホなどに表示されたコードも入力してパスワードだけが漏れても安全なようにするという仕組みの一つです。
    notestockではログイン時にシステムから指示されたコードを投稿してもらう形式になっており、これは投稿できる権限をもつアプリ作者などから悪用が可能です。
    そのため二要素認証を設定すれば、notestockが指示したコード以外に、二要素認証アプリに表示されるトークンが必要となり、安全性が高まります。

    また、ログインを無効にするアカウントの設定も可能となりました。
    notestockではグループ機能により、どのアカウントからでもログインが可能ですが、アカウントが多い場合など、全アカウントで二要素認証を設定するのが面倒なことがあります。
    その場合は、いくつかの主要なアカウントでのみ二要素認証を設定し、他のアカウントではログインを無効とすることで、セキュリティを強化しつつ面倒な設定を回避することが可能です。

  • Webhook機能にて、JSON形式での送信とContent-Typeの送信に対応しました
    もう一つ、使い道が難しいWebhook機能ですが。
    送信Bodyに$JSONだけを書くと、ActivityPubで受信したデータをそのまま送信します。Content-Typeの指定もできますので、自前で送信BodyにJSON形式で記入し送信することも可能となりました。

notestockの公開検索対象で、notestockが含まれている投稿をときどき確認していますので、何かあれば投稿しておいてもらえると、反応したりしなかったりします。
よろしくお願いします。

 

3月 03, 2019

システム稼働状況ページを作った

Service status osa-p.net を作った話。

元々、zabbixでシステムの状況はモニタリングしているのだが、それを外部に公開する仕組みを用意していなかった。zabbixのページをそのまま公開したくなかったので、必要な情報だけ抽出して表示できる仕組みが欲しかった。


SNSでつぶやいてみると

UptimeRobotというサービスを紹介してもらえた。

早速設定してみたところ、格好良い稼働状況ページが出来上がったのだが、うちのシステム上、ウェブサーバとデータベースが分離しており、データベースを使う処理は動かないが、ウェブサーバだけで完結する処理は動くという状況があり得て、その表示がしにくいなと感じた。

そこで、やはり自前で処理を作るかと、ついでに使ったことのなかったVueも試しに取り入れてみた。普段仕事でもまだまだjQueryを使うことが多く、また思い付いたサービスを個人で作るときにも早く公開したくて慣れているjQueryを使ってしまうことが多い。今回は急ぐものでもなかったので、サンプル程度しか動かしたことのなかったVueを使ってみた。といっても、やはりサンプルの継ぎはぎではあるのだけど。

処理自体は問題無くできて、さて公開するかというところで問題があった。
稼働状況ページは、自分が管理しているシステムの中で動かしてしまうと、一緒に落ちたときに肝心の状況が見えなくなってしまうので、公開ページは別のサービスで動かしたかった。まず最初に選んだのがS3で、ここでは静的サイトを公開する情報も整っていたので簡単に設定して公開。あとはネームサーバとして使っているCloudflareでCNAMEを張ってやれば動くだろうと考えていた。

実際に公開してみたところ、httpでは繋がるのだが、httpsでは接続ができなかった。S3の公開では、「https://S3ドメイン/バケット名/」だとhttpsが使えるのだが「https://バケット名.s3ドメイン」ではhttpsが使えない。Cloudflare側でHTTP Proxyを有効にしていたら、オリジンサーバーがhttpでも使えたような記憶があったのだけど、どうも上手く行かないので間にCloudFrontを挟んでhttpsでも繋がるようになった。

しかし別の問題が発生した。ページの作りとしては、zabbixから出力したSLAの情報をS3に5分毎にアップロードし、静的ページ側でそれを読み込んで表示する。CloudFrontは読み込んだ情報をキャッシュしてしまうので、いつまでも古い情報が表示されてしまうのだ。もちろんCloudFrontの設定にも用意されているので、TTLの設定を5分にしてみたり、クエリが付いていたらキャッシュしない設定にしたり、キャッシュをクリアしてみたりしたのだが、どうにも解消できなかった。

結局Netlifyで静的ページ部分を配信しつつ、データはS3から読み込むという仕組みで解決した。このやり方ならGitHub Pagesでも大丈夫だろうが、最初すべてをGitHub Pagesで配信しようと考えてしまい、5分毎にコミットとプッシュをしたら怒られそうだなと思って頭の中からGitHubを使うことを取り除いてしまっていた。

ひとまず大枠の仕組みが完成したので、これを応用して、zabbixに入力したメンテナンス情報を各サービスで表示したり、自動でメンテモードに切り替えたりもできるだろう。今はデータベースを止めるメンテナンスがあるときに、各サービスのcronを止めたり、フラグを立てたりと手動で処理してアクセスが止んだのを確認してから作業したりしているので、この辺りも自動化してしまいたいと考えている。



1月 27, 2019

PostgreSQLのshared_buffers設定とZFSのARCの関係を調べた

いつも個人のプロジェクトではPostgreSQLを使っており、自宅サーバで大きいデータベースを運用しています。最近まではmdadmで組んだRAID-5の上に、ext4でファイルシステムを作って、その中にデータベースのテーブルスペースを置いていました。
しかし、最近ZFSを使い始め、同じようにRAID-Zでファイルシステムを作ってテーブルスペースを置くようになりチューニングを再確認していたのですが、少し気になることが出てきたので調べてみました。

PostgreSQLのshared_buffers設定

PostgreSQLの設定には、shared_buffersというものがあり、搭載されているメモリから共有メモリを確保して、PostgreSQLの各プロセスが利用しています。この値は
1GB以上のRAMを載せた専用データベースサーバを使用している場合、shared_buffersに対する妥当な初期値はシステムメモリの25%です。 shared_buffersをこれよりも大きな値に設定することが有効なワークロードもあります。 しかし、PostgreSQLはオペレーティングシステムキャッシュにも依存するため、shared_buffersにRAMの40%以上を割り当てても、それより小さい値の時より動作が良くなる見込みはありません。(PostgreSQL日本語ドキュメント 19.4. 資源の消費より)
とあり、あまり大きくしても効果が無いとまで書かれています。
実際にext4でテーブルスペースを管理していた時は、この設定でhtopをみると搭載メモリの利用状況を示すバーの約25%が緑色、約75%が黄色となり、キャッシュが有効に働いていることが確認できました。

ZFSのARC設定

ZFSにはARCと呼ばれるメモリ上のキャッシュ機構を持っています。これは空きメモリから使用され、ディスクから読み出した際にARCにも格納され、同じデータの読み出しが発生した場合はディスクを参照せずここから読み出すことによって高速化を行います。ZFSを開発したSunのエンジニアが、MySQLで使う場合のチューニング指標として
ZFS上でMySQL/InnoDBを利用する場合、利用されるキャッシュにはいくつかの階層が存在します。InnoDB自身がバッファプールを持っていますし、ZFSにはARCがあります。そして、それらのキャッシュは個別に何をキャッシュまたはフラッシュすべきかということを判断するようになっています。そして、それらが同じデータをキャッシュするというような状況が生じてしまうこともあるでしょう。InnoDB内でキャッシュすると、データへたどり着くまでにより短い(そして高速な)コードパスで済むでしょう。そして、InnoDB内でキャッシュミスが生じれば、例えそのデータがARCに存在していたとしてもダーティページのフラッシュが生じてしまうことになります。これは不要な書き込みを生じさせる原因となります。ARCは利用可能なメモリの容量によって(自)動的に縮退・拡張しますが、単にそれを制限する方がより効率的です。我々が実施したテストでは、ZFS内でキャッシュするよりInnoDB内でデータをキャッシュしたほうが7〜200%の性能向上が見込めることを確認しています。(翻訳を紹介している漢(オトコ)のコンピュータ道: 違いが分かるエンジニアのためのMySQL/InnoDB/ZFSチューニング!より)
と紹介されています。このため、データベースでZFSを利用する場合ARCのキャッシュ情報はallではなくmetadataのみをキャッシュするように設定するという紹介をあちこちで見かけます。

鵜呑みにして設定

わたしもこれを読んで同じように設定していたのですが、思った以上にパフォーマンスが上がらず、はてどうしたものかと悩んでいました。そしてふと気が付いたのが、htopで表示されるメモリの使用状況バーは搭載メモリの25%だけが緑でキャッシュが全く使われていない状況でした。つまりメモリの25%しか使っていない状態でした。

ということは、ext4ではOSの標準設定によりキャッシュが働いているからshared_buffersを増やさなくても良いということなのですが、ZFSでキャッシュを最低限にしている場合、shared_buffersを確保した方がいいのではないか?ということです。

そこで、PostgreSQLにおいてZFSを使用する場合、shared_buffersを増やしたときと、ARCのすべてキャッシュするときのベンチマークを取ってみました。

以下の環境でテストを行いました。
  • Core i7-6700(3.4GHz) Windows 10 Pro上のHyper-Vで実行されるCentOS7
  • カーネル 3.10.0-957.1.3.el7.x86_64
  • CPU割り当て4
  • メモリ 4GB(Hyper-Vの動的メモリは使用しない)
  • ZFS 0.7.12(RPMからインストール)
    zfs set recordsize=128K tank(初期値)
    zfs set compression=off tank(初期値)
    zfs set dedup=off tank(初期値)
  • PostgreSQL 11.1(ソースからビルド)
  • pgbench -i -s 100 bench(1000万件)
  • SELECT pg_database_size('bench'); → 1,576,528,895(データベースサイズは約1.5GB)
  • 設定変更後に再起動。一度pgbench -l -T 60 -c 2 -j 2 -P 10 benchで60秒間のベンチを回して、その後5回分のトランザクション数を記録

テストパターンは以下の4種類です。
  1. 両方鵜呑みにする
    shared_buffers=1GB
    zfs set primarycache=metadata tank
  2. ZFSの言うとおりにデータベースのキャッシュを増やす
    shared_buffers=3GB
    zfs set primarycache=metadata tank
  3. PostgreSQLの言うとおりにファイルシステムのキャッシュを増やす
    shared_buffers=1GB
    zfs inherit primarycache tank(デフォルトがallなので)
  4. 一応両方増やす(サイズ的にshared_buffersが優先になるはず)
    shared_buffers=3GB
    zfs inherit primarycache tank

結果


回数\パターン1234
1656590758773
2552670835822
3613543663644
4586656788794
54766741016987
平均値577627812804
中央値586656788794

ZFSのキャッシュをした方が良いという結果になりました。
パターン2はパターン4と同じになるかと思ったのですが、パターン1よりは性能が良いがパターン3より性能が出ないということで、やはりshared_buffersの設定は増やしすぎても効果が無いようです。
またパターン3とパターン4でも差がないことからshared_buffersを増やすぐらいならARCに回した方が良いという結果になりました。

MySQLでZFSを使うシーンに出会っていないので、今回はPostgreSQLの設定だけですが、やはり実際に測ってみないと分からないものだなと感じました。


ちなみに、ZFSのレコードサイズをデータベースとあわせた方が良いという意見を見かけるので、8Kと16Kを試してみたのですが、

zfs set recordsize=8K tank
回数\パターン1234
1696688681689
2701688690704
3686674631716
4627621639654
5683633678657
平均値679661664684
中央値686674678689

zfs set recordsize=16K tank
回数\パターン1234
1678609682683
2713543682688
3543612604668
4592682680663
5667690689717
平均値639627667684
中央値667612682683

大した有意差が見られず、また128Kの方が成績が良かったことから、うちでも8Kにしていたのを128Kに戻しました。
ARCが効きやすいレコードサイズの設定があるのかと思って検索してみたりしたのですが、それらしいドキュメントは見つけられませんでした。ソースをあたるしかなさそうです。