【アップデート】ECS on FargateがsystemControlsをサポートし、カーネルパラメータが調整できるようになりました
CX事業部@大阪の岩田です。
8/9付のアップデートでECS on Fargateのタスク定義で指定可能なパラメータが増えました
今回のアップデートで指定可能になったパラメータは以下の2つです。
本ブログでは上記アップデートのうちsystemControlsについてご紹介します。
systemControlsとは
ECSのタスク定義ではsystemControlsというパラメータが指定可能です。このパラメータはdocker run の --sysctl
オプションに相当し、Linuxカーネルの各種カーネルパラメータが設定できるパラメータとなっています。従来このパラメータはECS on Fargateでは指定できず、ECS on EC2かつOSタイプがLinuxの場合のみ指定可能でした。
指定可能なカーネルパラメータ
SystemControlesはなんでもかんでも指定可能というわけではなく、現時点では以下のパラメータのみ指定可能となっています。
- kernel.msgmax
- kernel.msgmnb
- kernel.msgmni
- kernel.sem
- kernel.shmall
- kernel.shmmax
- kernel.shmmni
- kernel.shm_rmid_forced
- fs.mqueue.*
- net.*
ユースケースとして多いのはnet配下のパラメータを調整したいというケースでしょう。
- ECS上で動作するnginxなどのミドルウェアのパフォーマンスをチューニングしたい
- ECS上で動作するアプリケーションをAuroraのフェールオーバーに高速に追従させたい
といったユースケースが考えられます
やってみる
実際にタスク定義でsystemControlesを指定してカーネルパラメータが変更されることを確認していきます
systemControles指定無し
まずはsystemControles指定無しでタスクを起動してカーネルパラメータを確認してみます。
詳細は割愛しますが、タスク定義はこんな感じです。nginxのコンテナを起動するだけのシンプルなタスク定義です。
{ ...略 "containerDefinitions": [ { "name": "nginx", "image": "public.ecr.aws/nginx/nginx:1.24-alpine", ...略 } ], ...略 }
タスクが起動できたらECS Execでnginxのコンテナに乗り込みます
$ aws ecs execute-command \ --cluster <クラスタ名> \ --task <タスクID> \ --container nginx \ --interactive \ --command "/bin/sh"
sysctl -aを叩いてtcp_keepalive関連のカーネルパラメータを確認してみます
/ # sysctl -a 2>/dev/null | grep net.ipv4.tcp_keepalive net.ipv4.tcp_keepalive_intvl = 75 net.ipv4.tcp_keepalive_probes = 9 net.ipv4.tcp_keepalive_time = 7200
systemControles指定無しだとカーネルパラメータは以下の通りでした
- net.ipv4.tcp_keepalive_intvl = 75
- net.ipv4.tcp_keepalive_probes = 9
- net.ipv4.tcp_keepalive_time = 7200
systemControles指定あり
続いてタスク定義でsystemControlesを指定してみましょう。タスク定義にsystemControlsの指定を追加し、tcp_keepalive関連のパラメータを設定していみます。ちなみにこれらのカーネルパラメータはAurora PostgreSQL利用時のベストプラクティスとして紹介されているパラメータです。
https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/AuroraPostgreSQL.BestPractices.FastFailover.html#AuroraPostgreSQL.BestPractices.FastFailover.TCPKeepalives
{ ...略 "containerDefinitions": [ { "name": "nginx", "image": "public.ecr.aws/nginx/nginx:1.24-alpine", ...略 "systemControls": [ { "namespace": "net.ipv4.tcp_keepalive_intvl", "value": "1" }, { "namespace": "net.ipv4.tcp_keepalive_probes", "value": "5" }, { "namespace": "net.ipv4.tcp_keepalive_time", "value": "1" } ] } ], ...略 }
先程と同様にsysctl -aを叩いてtcp_keepalive関連のカーネルパラメータを確認してみます
/ # sysctl -a 2>/dev/null | grep net.ipv4.tcp_keepalive net.ipv4.tcp_keepalive_intvl = 1 net.ipv4.tcp_keepalive_probes = 5 net.ipv4.tcp_keepalive_time = 1
タスク定義のsystemControlsで指定したパラメータが反映されていることが確認できました!
まとめ
ECS on Fargateでカーネルパラメータが調整できるようになったことを確認してみました。このアップデートによって、ECS on Fargateがより痒いところに手が届く存在になったのではないでしょうか。ECS on Fargateでアプリを動かしているけど、Auroraのベストプラクティスに沿った設定ができない...といったお悩みを抱えていた方は是非導入を検討してみて下さい。