zuntan02のはてなブログ

備忘録的なものです。時々職場の技術者ブログにも転記してますが、メインはこちらで。

【Docker】メモリを使い尽くしてOS諸共死なないために

【概要】

Docker上で動かしていたcollabora onlineで巨大なスプレッドシートを開いたらメモリ+swapを一気に使い尽くしてOSごとお亡くなりになった。
dockerのメモリソフトリミット(--memory-reservation)セットして再挑戦したらいけた。

【参考】

knowledge.sakura.ad.jp

【メモ】

# メモリのソフトリミット1GB
docker run -td --memory-reservation 1g hogefuga

# 確認
dovker stats

CONTAINER           CPU %               MEM USAGE / LIMIT      MEM %               NET I/O             BLOCK I/O           PIDS
xxxxxxxxxxxx        0.78%               1.005 GiB / 3.86 GiB   26.03%              480 MB / 1.64 GB    28.9 GB / 761 MB    0

いけてる

【メモ】Linux:duでディレクトリサイズを比較したら同じはずなのにサイズが異なる

理由

duコマンドは、ファイルサイズではなくブロックサイズで表示するので正確な数値が表示されない。

【参考】

http://sonic64.com/2004-05-26.html
http://blue-red.ddo.jp/~ao/wiki/wiki.cgi?page=%A5%C7%A5%A3%A5%EC%A5%AF%A5%C8%A5%EA%A4%CE%CD%C6%CE%CC%A4%F2%C4%B4%A4%D9%A4%EB

find ./ -type f -printf "%s\n" |awk '{ sum += $1; }; END { print sum }'

で正確なファイルサイズの合計が表示される

現象例

du -hとしたらサーバAとBでサイズが違う

du -h

[サーバA]
8.0K    ./sample/jnlp/servlet/src/classes/jnlp/sample/jardiff/resources
52K     ./sample/jnlp/servlet/src/classes/jnlp/sample/jardiff
16K     ./sample/jnlp/servlet/src/classes/jnlp/sample/util
8.0K    ./sample/jnlp/servlet/src/classes/jnlp/sample/servlet/resources
124K    ./sample/jnlp/servlet/src/classes/jnlp/sample/servlet
196K    ./sample/jnlp/servlet/src/classes/jnlp/sample
200K    ./sample/jnlp/servlet/src/classes/jnlp
204K    ./sample/jnlp/servlet/src/classes
1.4M    ./sample

[サーバB]
16K     ./sample/jnlp/servlet/src/classes/jnlp/sample/jardiff/resources
80K     ./sample/jnlp/servlet/src/classes/jnlp/sample/jardiff
28K     ./sample/jnlp/servlet/src/classes/jnlp/sample/util
16K     ./sample/jnlp/servlet/src/classes/jnlp/sample/servlet/resources
184K    ./sample/jnlp/servlet/src/classes/jnlp/sample/servlet
300K    ./sample/jnlp/servlet/src/classes/jnlp/sample
308K    ./sample/jnlp/servlet/src/classes/jnlp
316K    ./sample/jnlp/servlet/src/classes
2.2M    ./sample

# 上記のfind+awkのコマンドで比較

find ./sample -type f -printf "%s\n" |awk '{ sum += $1; }; END { print sum }'

[サーバA]
861865

[サーバB]
861865

先人の知恵に感謝しつつリブログ

【コマンドメモ】大規模データの転送やインポートを時間測りつつ実施(nohup と timeコマンド)

例)MySQLのリストア

1)nohup time をつけてリストアを開始
nohup time mysql -uユーザ名 -p -h hogefuga.fugahoge.ap-northeast-1.rds.amazonaws.com databasename < database_dump.sql > nohup_database.out

→パスワードは普通に入力してリストア開始

2)[Ctrl+z]で一時停止
# ^Z
# [1]+  Stopped                 nohup time mysql (省略)
3)jobsで確認してBackgroundに回す
jobs -l
# [1]+ 17781 Stopped                 nohup time mysql (省略)

bg 1
# [1]+ nohup time mysql (省略) &

jobs -l
# [1]+ 17781 Running                 nohup time mysql (省略)&

SCPとかrsyncとかパスワード入力を求められるような場合は同じパターンで対応可能。
今更ですが、忘れがちなので。

【qmail】qmHandleの導入と設定メモ

【メモ】

qmailを使ってると必須のツールqmailHandleでメールを削除する際、qmailのサービスを停止するのだが、

Calling system script to terminate qmail...
svc: warning: unable to chdir to /service/qmail-deliver: file does not exist

こんなエラーが出てサービスが停止できない場合がある。
本体はスクリプトなので直接編集すればOKだった。

【参考】

続きを読む

【PHP】Excel_Reviserが64bit版OSで動作しない件の暫定対応

【問題】

http://chazuke.com/?page_id=126
Excel_Reviser(reviser.php)が64ビットOSで動かない。
32ビット版CentOSで動作していたPHPアプリケーションを丸ごとAmazonLinux(64bit)に持っていったら、Excel_Reviserがエラー。

※以下の様なエラーが出た

  • ERROR file(エクセルファイル名) is broken (sStartBlk)
  • ERROR file(エクセルファイル名) is broken (ExBlock)

■今回AWSへの移設だったのでこまった
# AmazonLinuxに32bit版は存在しない
# AWS MarkecplaceのCentOS6.9 32bitを使用することも検討したが、公式の32bit版が見当たらない。公式曰く
https://wiki.centos.org/Cloud/AWS#head-d569f212a6094ccba6bfada7bd573b9f7b27d4bb
> i386
> On advice from AWS, we no longer publish or maintain i386/i686 images;
とのことで断念した。一応古いものとして
> CentOS 6.4 (i386) - Release Media
は存在している

【やったこと】

!!以下バッドノウハウです。分かる人なおして!!

(って書いたら許されるかな。。。)
エラー処理を殺して無理やり動かした。


続きを読む

【原因不明】AWS EC2を再起動したらntpサーバに接続できなくなったけどもう一回再起動したらつながった

【概要】

タイトル通り。
AmazonLinuxが動作しているEC2サーバ(奇跡的に3年以上無停止)についてAWSより強制再起動予告が来た、のでELBから切り離して再起動し、特に問題なく再起動できた(と思っていた)。
数日後、ログのタイムスタンプがおかしいことに気づく。
→ntpq -p で確認するとntpサーバと同期できてない
→ntpd再起動しても復旧しない
→EC2インスタンス自体はパブリックサブネットにEIPつけて配置しているだけ、他のサーバは問題なく時刻同期している。
→ntpdate clock.nc.fukuoka-u.ac.jp で明示的に指定すると時刻合わせはできるが、そのあとntpd再起動してみるとやはり同期していない

で、再度OS再起動したら問題なくなった。
ベースマシンのハードウェアクロックとかに問題ある?

【作業メモ】

chkconfig --list ntpd
# ntpd            0:off   1:off   2:on    3:on    4:on    5:on    6:off

ntpq -p
#      remote           refid      st t when poll reach   delay   offset  jitter
# ==============================================================================
#  ec2-54-64-6-78. 133.243.238.244  2 u   27   64  377    0.399  2795382 20356.3
#  marisa.jp.futa. 160.16.75.242    3 u  185   64  274    2.633  2794279 21967.3
#  y.ns.gin.ntt.ne 249.224.99.213   2 u   34   64  377    8.474  2795340 20754.2
#  li1701-26.membe 157.7.208.12     3 u   14   64  377    1.517  2795479 20283.5
# →同期中のサーバがない

# ntpd再開
service ntpd stop
service ntpd start

# 確認
ntpq -p
→やはりだめ

# shutdown -h nowしてマネージドコンソールで再度起動
ntpq -p
#      remote           refid      st t when poll reach   delay   offset  jitter
# ==============================================================================
# +next.kkyy.me    133.243.238.243  2 u   24   64  377    1.653   17.703   2.599
# +extendwings.com 133.243.238.244  2 u   18   64  377    2.299   13.270  22.075
# +v157-7-235-92.z 103.1.106.69     2 u   12   64  375    1.958   18.669  21.148
# *ec2-54-64-6-78. 133.243.238.244  2 u   22   64  377    0.408   17.355   2.258
# →同期できている

セキュリティグループACLでアウトバウンド:UDP/123閉じたときと似ているけど、その時はoffsetも0秒だったので、ちょっと違う。
うーん、ベースマシンが外れとかそういうのある?
原因がわかったら追記しますが、こんな事例もあったということで。。

事後対応

zabbixで時刻ズレ監視
【参考】
https://qiita.com/miyahang55/items/9d1f99e9549143cdc8de
https://www.zabbix.com/documentation/2.2/jp/manual/appendix/triggers/functions

fuzzytime 	sec 	浮動小数、整数
タイムスタンプ(アイテムの値)とZabbixサーバ時刻の差が N 秒以内なら1、それ以外なら0を返します。
通常は system.localtime と組み合わせて、ローカル時刻とZabbixサーバのローカル時刻が同期しているかどうかをチェックします。

上記を参考に以下の様なトリガーを追加

項目	値
名前	サーバ時刻差分発生:{HOST.NAME}
条件式	{Template OS Linux:system.localtime.fuzzytime(3)}=0
深刻度	重度の障害

その他

NTP pool
pool.ntp.org: the internet cluster of ntp servers
の事を今回初めて知りました。
例のclock.nc.fukuoka-u.ac.jpばっかり使ってないでこれを使わないといかんですね

追記

ntpq -pの見方 – 猫型iPS細胞研究所

曰く
> ntpdateを使用する場合はntpdは停止する必要があります。