【アップデート】ECS on FargateがsystemControlsをサポートし、カーネルパラメータが調整できるようになりました

ECS on Fargateでもカーネルパラメータが調整できるようになり、より柔軟な設定が可能になりました
2023.08.11

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のベストプラクティスに沿った設定ができない...といったお悩みを抱えていた方は是非導入を検討してみて下さい。

参考