dentryキャッシュ対応に悩まされた話
原因は完全にこれ↓で
要約すると、余裕がある時はめっちゃcurlしてキャッシュするっていう機能があって
放置するとmemoryをどんどん使っていくので
nss-softokenを3.16以上にしてオプション有効にしようね、という話
Bug 1044666 – Can curl HTTPS requests make fewer access system calls?
でも報告されていて、NSS_SDB_USE_CACHEをYESかNOにすると
sdb_measureAccessを呼ばなくなるらしい
自分のところではswap領域を使わないまま
約24時間でusedが7GB弱増えていました
export NSS_SDB_USE_CACHE=YES
を/etc/sysconfig/httpdに追加して経過観察してたけど全然効き目がなく
適当に設定をNOにしてみたり無意味に大文字小文字を変えてみたりの無駄な手順を試したけど当然効かず
でも放置するわけにもいかないので毎日dentryキャッシュを削除していました
↑ キャッシュを削除する日々の図
最初はアラートで呼ばれたので対応して、
次の3回くらいはアラートを飛ばさないためにキャッシュ削除しただけで
その後は設定を入れてもうまくいかない戦いです
すごい徒労感があるね!
諸々のバージョン
$ httpd -V Server version: Apache/2.4.25 (Amazon) $ sudo yum list nss-softokn nss-softokn.x86_64 3.16.2.3-14.4.39.amzn1 $ curl -V curl 7.51.0 (x86_64-redhat-linux-gnu) libcurl/7.51.0 NSS/3.28.4
やってたこと
NSS_SDB_USE_CACHE=yesが効きそうか見る
access回数が減るので効果はあるはずなのに
apacheを再起動して数時間待つとなぜかメモリ消費してた
See. アプリケーション内でhttpsによる外部APIを叩いているサーバのメモリ使用量が増加し続ける件について - s_tajima:TechBlog
$ strace -fc -e trace=access curl 'https://www.google.com' > /dev/null % time seconds usecs/call calls errors syscall ------ ----------- ----------- --------- --------- ---------------- 100.00 0.000065 0 1626 1622 access # ここがおかしい ------ ----------- ----------- --------- --------- ---------------- 100.00 0.000065 1626 1622 total $ NSS_SDB_USE_CACHE=yes strace -fc -e trace=access curl 'https://www.google.com' > /dev/null % time seconds usecs/call calls errors syscall ------ ----------- ----------- --------- --------- ---------------- 0.00 0.000000 0 32 30 access # 効いてる ------ ----------- ----------- --------- --------- ---------------- 100.00 0.000000 32 30 total # noでもこれくらい $ NSS_SDB_USE_CACHE=no strace -fc -e trace=access curl 'https://www.google.com' > /dev/null % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 272 100 272 0 0 1786 0 --:--:-- --:--:-- --:--:-- 1789 % time seconds usecs/call calls errors syscall ------ ----------- ----------- --------- --------- ---------------- 0.00 0.000000 0 58 56 access ------ ----------- ----------- --------- --------- ---------------- 100.00 0.000000 58 56 total
オプションをつけずにcurlすると何度もaccessされるのがわかる
$ strace -e trace=access curl 'https://www.google.com' > /dev/null ... access("/$HOME/.pki/nssdb/cert3.db", F_OK) = -1 ENOENT (No such file or directory) access("/$HOME/.pki/nssdb/cert2.db", F_OK) = -1 ENOENT (No such file or directory) access("/$HOME/.pki/nssdb/key3.db", F_OK) = -1 ENOENT (No such file or directory) access("/$HOME/.pki/nssdb/key2.db", F_OK) = -1 ENOENT (No such file or directory) access("/$HOME/.pki/nssdb/secmod.db", F_OK) = -1 ENOENT (No such file or directory) access("/etc/pki/nssdb/.3550898456_dOeSnotExist_.db", F_OK) = -1 ENOENT (No such file or directory) access("/etc/pki/nssdb/.3550898457_dOeSnotExist_.db", F_OK) = -1 ENOENT (No such file or directory) access("/etc/pki/nssdb/.3550898458_dOeSnotExist_.db", F_OK) = -1 ENOENT (No such file or directory) ...
設定反映されてないのかな
環境変数を見ると入っているのになぁ・・って思ってました
$ sudo od -S1 -An /proc/4057/environ # httpd TERM=xterm PATH=/sbin:/usr/sbin:/bin:/usr/bin PWD=/ LANG=C SHLVL=2 NSS_SDB_USE_CACHE=YES # ここ _=/usr/sbin/httpd
直線で増加していくのっておかしくない?
httpdが原因ならアクセス数に比例するはずなのに
直線で増加していくのっておかしくない?ってようやく気づきました
内部でずっと動いてくれているものにすごく心当たりがあって・・・
出来心で/etc/sysconfig/mackerel-agentにも同じ内容追加して
エージェント再起動したのがこちら
キャッシュ増加が止まったのがはっきりわかって
嬉しくて思わずslackにも流してしまったやつ
最初のブログにもhttpd以外にも必要なら入れてね!って書いてあったのに!!
逆にhttpdからその環境変数外すとどうなるんだろうと思って外したら
増加の仕方はとてもゆっくりという結果になりました・・
アプリケーションの負荷ェ.....
他のメトリックにも特に影響は見られなかったので
ひとまずは解決で良さそうだけど
特定プロセスに対してしか設定してないから
たとえばサーバ内でcurlされるとキャッシュは増加するまんま・・・(。ŏ﹏ŏ)
他にそういうツールとかいれたらまた同じことが発生するなぁ・・
Mackerelで他のオーガニゼーションのアラート状況もまとめて把握したかった
午前2:30くらいにCPU100%のアラートが来て
しばらくしても戻らなかったので
のそのそと布団から這い出て確認するとstealが100%になってました
t2.microでCPUのstealが100%でググるといっぱいでてくるから割りとあることみたいなので
本番環境じゃなくてよかったなぁって思いつつ
インスタンス再起動を待ちながら所属するオーガニゼーションをフラフラと巡ってた
メインで見ているオーガニゼーションは
いつも通りのアラートが出ていて(アカン)
ああ、明日なんとかしよう・・と思って見なかったことにして(ちゃんと今日対応しました!)
サブのオーガニゼーションたちを見ると
そこにもアラートがちらほらしていてこれって誰か検知してるの?という状態でした
さすがに他のオーガニゼーションのアラート数を取得するというアグレッシブ機能はなくて
MackerelのAPI経由でアラート数を取得して投稿したらいいんじゃない?っていう声が近くからしたのでやってみました
今回はshellがあまりにも雑なので割愛します
アラートを意図的に起こしてslackを騒がせたのでグラフもとても賑やかです😊
19時あたりは意図的に起こしたアラートをすべてクローズしたのに
0になっていない図となりました
来週やるぞ😵
ハムスターのために監視導入したら人間のための監視もしたほうが良さそうなことがわかりました
Mackerel Advent Calendar 2017 - Qiita の12/20の記事です
以前、【増枠】紅白 Milkcocoa 合戦!【祭り】 Milkcocoa Meetup vol12 - connpassでLTしたこれを
(要約:3時間で勝手にエアコンが切れるアパートで、
ハムスターのために温度が一定以上になったらラズパイでエアコンつけて夏を乗り切りました)
いろいろと事情が変わったので、今回はMackerelを使って改造してみました!
前回より
変わったこと
実は当時のアパートから引っ越ししたので事情がとても変わりました
- エアコンが勝手に切れない!!
- ハムスターたちとエアコンが遠いので、ハムスターのそばで温度を取ると赤外線が届かない
- もしかして実はもう必要ないのでは...
当時の課題
- 湿度を取っているのに表示していない、SPだと崩れてる
- 得意でないフロントゴリゴリ実装でもう1個グラフを増やす気力が沸かなかった😂
- 後追いでグラフを見て確認できるけど、状況をPushしていない
- 当時をよく覚えていないけどHubot周りがうまくいかず諦めちゃった😂
ここにMackerelを導入してみました
Mackerelにカスタムメトリック投稿
物理的な実装はセンサーつないだだけなので割愛します
温度と湿度を取得して出力
ホストのカスタムメトリックを投稿する - Mackerel ヘルプ を参考にタブ区切りで出力
import time import get_environment as env # 温度取得はmilkcocoa送信用に実装済みなので流用 # vars epoch_seconds = str(time.time()) try: # get host_id with open('/var/lib/mackerel-agent/id') as mackerel_agent_id: host_id = mackerel_agent_id.read() # output datas print('\t'.join(['env.temp', env.temperature, epoch_seconds])) print('\t'.join(['env.hum', env.humidity, epoch_seconds])) except Exception as e: print('failed in sending to mackerel') print(e)
実行結果
$ sudo /usr/bin/python /PATH_TO_SOURCE/mackerel_monitor_temperature.py env.temp 22.40 1512901475.44 env.hum 36.40 1512901475.44
mackerel-agent.confに追記
# 追記内容 [plugin.metrics.raspi] command = "sudo /usr/bin/python /PATH_TO_SOURCE/mackerel_monitory_temperature/mackerel_monitor_temperature.py"
agent起動
$ nohup sudo /usr/local/bin/mackerel-agent >> /var/log/mackerel-agent.log &
こうなる
青いグラフが湿度、オレンジが温度です
※12/9の21時ごろに湿度がいきなりあがったのは冷しゃぶしたからです
監視を入れます
ハムスターにとって快適な温度は20〜26度で、
冬場は風邪を引かないための湿度は40〜60%が良いらしいのでこんな監視設定をします
$ mkr monitors [ { "id": "3bwDVM8jm1h", "name": "custom.env.hum over 60%", "memo": "ジメジメだよ(。>﹏<。)", "type": "host", "metric": "custom.env.hum", "operator": ">", "warning": 60, "critical": 65, "duration": 3 }, { "id": "3bwDQLE4bTS", "name": "custom.env.hum under 40%", "memo": "干からびちゃうよ(。ŏ﹏ŏ)", "type": "host", "metric": "custom.env.hum", "operator": "<", "warning": 45, "critical": 40, "duration": 3 }, { "id": "3bw5wNYbhN5", "name": "custom.env.temp over 26℃", "memo": "暑いよ(;´Д`)", "type": "host", "metric": "custom.env.temp", "operator": ">", "warning": 25, "critical": 26, "duration": 3 }, { "id": "3bw5memzmP3", "name": "custom.env.temp under 20℃", "memo": "寒いよ:;(∩´﹏`∩);:", "type": "host", "metric": "custom.env.temp", "operator": "<", "warning": 21, "critical": 20, "duration": 3 } ]
監視設定した途端いきなりCRITICAL来た
温度とか言ってる場合じゃない!!
(温度は無事20〜26度をさまよっていました)
朝の喉のイガイガ感の原因がはっきりしました
ここまでで
- ちょっとPython書いたらメトリック投稿できた
- フロント頑張らなくてもグラフ表示できる!!!
- 簡単に湿度まで可視化できた!!
- しかも実はラズパイの死活監視までできている
はまったところ
invalid JSONされる
2017/12/03 11:54:14 WARNING <command> metadata plugin "raspi": outputs invalid JSON: env.temp 22.50 1512302054.61
mackerel-agent.confの書き方がだめでした
# これでエラー [plugin.metadata.raspi] command = "sudo /usr/bin/python /home/pi/work/mackerel_monitory_temperature/mackerel_monitor_temperature.py" # "plugin.metrics."ではじめないといけない [plugin.metrics.raspi] command = "sudo /usr/bin/python /home/pi/work/mackerel_monitory_temperature/mackerel_monitor_temperature.py"
ドキュメントろくに呼んでない自分が完全に悪いけど
エラーメッセージがもうちょっと親切だとありがたかったかも...
エージェント経由ってタブ文字区切りだとだめなの...?で数日悩みました( ;∀;)
おわりに
アドベントカレンダー書くぞと帰ってきて加湿器つけてこんな感じで
湿度がCRITICALとWARNINGを行き来しています
お湯を800mlくらい蒸発させたときは湿度20%くらいあがって、すごい即効性がありました
やったことが数字になってわかるのもおもしろいね(●´ϖ`●)
DeployerでmacからはデプロイできるのにLinuxで実行したら死んだ
業務で使っているDeployerで普段ローカルからデプロイしていたものを
AWSのEC2に乗っけて動かそうとしたら思わぬエラーが出たのでメモ
デプロイ手順(こんな手順を踏まないといけない経緯は悲しいので書かない)
- デプロイサーバー(EC2)で不要なファイル以外を圧縮 ←ここで死んだ
- デプロイ先(EC2)へ転送
- デプロイ先(EC2)で解凍
- 以降はDeployerの動作に任せる
エラー内容
[RuntimeException] tar: ./proj.tar.gz: 読み込んだファイルが変更されています Exception trace: () at phar:///home/deploy-user/deploy/deployer.phar/src/functions.php:335 runLocally() at /home/deploy-user/deploy/include/tasks.php:27 {closure}() at n/a:n/a call_user_func() at phar:///home/deploy-user/deploy/deployer.phar/src/Task/Task.php:79 Deployer\Task\Task->run() at phar:///home/deploy-user/deploy/deployer.phar/src/Executor/SeriesExecutor.php:43 Deployer\Executor\SeriesExecutor->run() at phar:///home/deploy-user/deploy/deployer.phar/src/Console/TaskCommand.php:82 Deployer\Console\TaskCommand->execute() at phar:///home/deploy-user/deploy/deployer.phar/vendor/symfony/console/Command/Command.php:256 Symfony\Component\Console\Command\Command->run() at phar:///home/deploy-user/deploy/deployer.phar/vendor/symfony/console/Application.php:791 Symfony\Component\Console\Application->doRunCommand() at phar:///home/deploy-user/deploy/deployer.phar/vendor/symfony/console/Application.php:186 Symfony\Component\Console\Application->doRun() at phar:///home/deploy-user/deploy/deployer.phar/vendor/symfony/console/Application.php:117 Symfony\Component\Console\Application->run() at phar:///home/deploy-user/deploy/deployer.phar/src/Deployer.php:101 Deployer\Deployer->run() at phar:///home/deploy-user/deploy/deployer.phar/bin/dep:63 require() at /home/deploy-user/deploy/deployer.phar:4 deploy [-p|--parallel]
原因
圧縮しようとしている中にtarファイルを作っている
prj/配下を圧縮している最中にprj/[圧縮ファイル].tar.gzを置けるか置けないかの違いでした
なぜ今まで(mac)は行けたの?
macはtarの提供元が違った
# mac bsdtar 2.8.3 - libarchive 2.8.3
FreeBSDっていうところが提供しているbsdtarっていうのが入ってる
https://www.freebsd.org/cgi/man.cgi?query=bsdtar&sektion=1
# Amazon Linux $ tar --version tar (GNU tar) 1.26 Copyright (C) 2011 Free Software Foundation, Inc. 使用許諾 GPLv3+: GNU GPL version 3 またはそれ以降 <http://gnu.org/licenses/gpl.html> This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. [参考訳] これはフリーソフトウェアです. 変更と再配布は自由です. 法律で認められる範囲で「無保証」です. 作者: John Gilmore, Jay Fenlason.
対処
prj/配下に圧縮ファイルを置かない
入ってるものが違うからそりゃエラー変わるよね!
仮想サーバか物理サーバか調べたら変なの出てきた
ちょっと物理か仮想か調べることになったので調べてたら想定外のものが出てきたので
調査方法と他をめも
調べ方
やってみた
$ sudo dmidecode -t system # Product Name: KVMが出たら仮想 $ sudo dmidecode -s system-serial-number # Not Specified が出たら仮想 # 上のコマンドのSerial Numberだけ表示
変なの出た
$ sudo dmidecode -t system # Product Nameを抜粋 Product Name: VMware Virtual Platform $ sudo dmidecode -s system-serial-number Serial Number: VMware XX XX XX # 謎のシリアル番号が出る
KVMとかNot Specifiedじゃないけどとても仮想くさい名前が出て困る