2018/11/06

Getting Started with Erlang

2 Sequential Programming 終了まで。基礎的な文法を一通り学ぶ。

2.9 A Larger Example

print_temp simply calls io:format in a similar way to what has been described above. Notice that ~-15w says to print the “term” with a field length (width) of 15 and left justify it. (see the io(3)) manual page in STDLIB.

manがとても充実しているためio(3)は必読

2.10 Matching, Guards, and Scope of Variables

list_max([Head|Rest], Result_so_far) when Head > Result_so_far ->
    list_max(Rest, Head);

when is a special word used before the -> in the function to say that you only use this part of the function if the test that follows is true. A test of this type is called guard. Some useful operators in guards are: < less than > greater than == equal >= greater or equal =< less or equal /= not equal

not equalが!=ではなく/=である点に注意

2.12 If and Case

        A == 2, B == 3 ->                      %That is A equals 2 and B equals 3
            io:format("A == 2, B == 3~n", []),
            a_equals_2_b_equals_3;
        A == 1 ; B == 7 ->                     %That is A equals 1 or B equals 7
            io:format("A == 1 ; B == 7~n", []),
            a_equals_1_or_b_equals_7

andは, orは ;

2.13 Built-In Functions (BIFs)

Only a few BIFs can be used in guards, and you cannot use functions you have defined yourself in guards. (see Guard Sequences)

2.14 Higher-Order Functions (Funs)

86> Xf = fun(X) -> X * 2 end.
#Fun<erl_eval.5.123085357>
87> Xf(5).
10

無名関数はfun()

convert_list_to_c(List) ->
    lists:map(fun convert_to_c/1, List).

既に宣言された関数をfunとして呼び出す

alert:WARNING mstdn.unigiri.net Memory % 71.06% > 70.0%

発生時刻

2018/11/06 23:54:57

解消時刻

2018/11/07 02:24:57

対応内容

WARNING閾値を一旦70%から80%へ上げる。sidekiqのメモリ使用量削減のため、後日Mastodonの弱小インスタンスを運用するのに設定したこと(随時更新) - Qiita 2018/09/29 追記 Sidekiqのメモリ使用量削減の実行を検討する。

概要

23:51から23:52にかけ、メモリ使用量が約130MB増加。元々WARNING閾値に近かったこともあり、この増加でアラートが発生した。

メモリ以外の特徴として23:51にinterface eth0 rxBytes 1.28MB, 23:52にdisk writes 12.0IOPSを確認している。

調査詳細

アラート発生時刻周辺のnginx access.logを確認。diskへのwrites増加があるためPOSTに絞ったが不審なアクセスはなし。

強いて挙げるとすれば発生時刻直前に証明書の有効期限切れドメインmastopeek.app-dist.euから複数のGETが来ていたが、これは数分おきにきている上簡単なjsonを返すAPIを叩いてるため今回のアラート原因ではないと判断した。

$ cat access.log | grep '06/Nov/2018:14:4' | grep mastopeek
159.69.113.20 - - [06/Nov/2018:14:47:19 +0000] "GET /api/v1/instance HTTP/1.1" 200 251 "-" "MastoPeek v0.6.2 - https://mastopeek.app-dist.eu"
159.69.113.20 - - [06/Nov/2018:14:47:20 +0000] "GET /api/v1/instance HTTP/1.1" 200 251 "-" "MastoPeek v0.6.2 - https://mastopeek.app-dist.eu"
159.69.113.20 - - [06/Nov/2018:14:47:20 +0000] "GET /api/v1/instance/peers HTTP/1.1" 200 2889 "-" "MastoPeek v0.6.2 - https://mastopeek.app-dist.eu"
159.69.113.20 - - [06/Nov/2018:14:47:20 +0000] "GET /api/v1/instance/activity HTTP/1.1" 200 196 "-" "MastoPeek v0.6.2 - https://mastopeek.app-dist.eu"

サーバの時刻設定がUTCであるため9時間ずらしている。

PostgreSQLのログは0行。

cronで回しているキャッシュ削除のコマンドが古く実行不可能になっていたため、手動実行したが効果なし。

$ RAILS_ENV=production bundle exec bin/tootctl media remove --days=7 --verbose

...

4738

Removed 4049 media attachments

原因追求を中断しメモリ使用量の削減を考えるため、使用状況を調査。sidekiqが最もメモリを使用してたため後日Mastodonの弱小インスタンスを運用するのに設定したこと(随時更新) - Qiita 2018/09/29 追記 Sidekiqのメモリ使用量削減の内容を調査し、効果が期待できれば実行する。

$ ps aux --sort=-vsz | head | awk '{print $4" "$11}'
%MEM COMMAND
18.5 sidekiq
13.0 puma:
13.7 puma: 

メモリの残り容量に余裕があり、導入の検討に時間をかけたいためWARNING閾値を80%へ上げてアラートを解消する。