Digdagパフォーマンス上がってエラー出る頻度が少なくなってた。これはブログだな。
— adachin👾SRE (@adachin0817) July 13, 2021
上記、会社のDigdagサーバーをECS/Fargateに移行してから、どうもパフォーマンスが悪く、BigQueryのシンク時にエラーが多発することが見受けられました。悪い時で10分に一回出ており、以前プラグインのバージョンアップをして解決できたと思いきや変わってなかったということと、モニタリングしていると急にCPU使用率が下がっていることも確認でき、シンク速度も5時間から約7時間ほどに減速していることもわかりました。
- Failed to add subtasks because of task limit
digdagで
「Failed to add subtasks because of task limit」が出てしまったんだが、ググると -X io.digdag.limits.maxWorkflowTasks=100000をdigdag起動時に指定すればOKとのことなのだが、そんなオプションはないと怒られた… ヘルプミー!— adachin👾SRE (@adachin0817) July 13, 2021
また、DigdagでもFailure出しているのにも関わらず、task limitのエラーが起きており、Slackに通知されなく気づかない事象が起こりました。今回Digdagのチューニングやエラー対応ついてブログしたいと思います。
Digdag起動方法を変更
https://qiita.com/toyama0919/items/26033d8dce37cb2d3a40
https://docs.oracle.com/cd/F25597_01/document/products/jrockit/jrdocs/refman/optionX.html
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
[supervisord] nodaemon=true [program:digdag] directory=/etc/digdag command=java -Dio.digdag.cli.launcher=selfrun -XX:+AggressiveOpts -XX:TieredStopAtLevel=1 -Xverify:none -jar /usr/local/bin/digdag server --max-task-threads 2 --config server.properties -b 0.0.0.0 --task-log /var/log/digdag/task_log user=root autostart=true autorestart=true stopsignal=TERM stdout_logfile=/dev/stdout stdout_logfile_maxbytes=0 stderr_logfile=/dev/stderr stderr_logfile_maxbytes=0 |
前回までは単にdigdag serverで --max-task-threads
のオプションのみ実行するだけの起動をしていましたが、DigdagはJavaで動作していることもあり、JavaのJVMのチューニングが可能です。なのでJVMのオプションを加えるだけでDigdagの高速化などが行なえます。今回は上記のように設定してみました。
しかし –max-task-threads` って並列実行数制御できるからこれでパフォーマンス良くなると思いきや、CPU使用率を制御できるだけだから暴走を防ぐということかな。
Javaの機能とは無関係なのか…!
また、digdag server -Xで指定するオプションはDigdagが用意しているオプションでブログでリンクされているJavaの機能とは無関係だと思います。
設定ファイルに書く代わりにdigdag server -X io.digdag.limits.maxWorkflowTasks=100000 みたいに書けた気がするけどちょっと確認が必要です。— Hiroyuki Sato (@hiroysato) July 14, 2021
Failed to add subtasks because of task limitについて
https://t.co/jvN33R85xx
なるほど!!…こんな感じで指定ができるんですね。— adachin👾SRE (@adachin0817) July 13, 2021
こちらは毎度@hiroysaotoさんにフォローしていただきましたが、digdag起動時に利用する設定ファイル/server.propertiesに以下を追加することで回避できます。
1 2 3 4 5 6 7 8 |
database.type = hoge database.user = hoge database.password = hoge database.host = hoge database.port = 5432 database.database = hoge digdag.secret-encryption-key = hoge io.digdag.limits.maxWorkflowTasks = 100000 #追加 |
- Increasing default value of active task limit
https://github.com/treasure-data/digdag/issues/508
Currently, an attempt of a workflow can’t have more than 1000 active tasks.
ちなみに1000以上のタスクは含められないそうだ…ここらへんは運用しているとシンクするテーブル数が増えるのでしゃーない感じかな。
結果
全プロジェクトのシンクスピードが向上されました!CPU使用率もちゃんと使われているので頑張ってますな。
まとめ
Digdagのパフォーマンスが悪くなったらCPU使用量を確認して、下がっていればエラーが出やすいのと、JVMのオプションを利用してチューニングするのがベストだと勉強になりました。それとエラー対応についてDigdagはOSSなのでコード追えばわかったはずだった….今後は意識しよう。
※追記
もししきい値を上げてもlimitがかかる場合はワークフローを分けましょう。プラス --max-task-threads
を上げてみましょう!
0件のコメント