私はKubernetesを使い始めたばかりで、php webappに設定する必要のあるリソース制限を把握しようとしています。
私の最初の推測では、最大256Mのメモリを使用するようにphp fpmを構成した場合、kubernetesも256Mに制限するように構成する必要があります。
セットアップは次のようになります。
Phpコンテナーを構築するDockerfileで、php memory_limitを256Mに設定します。
sed -i '/^;php_admin_value\[memory_limit\]/cphp_value[memory_limit] = 256M' /usr/local/etc/php-fpm.d/www.conf
私のKubernetes Deployment
では、fpmコンテナーに次のようなリソース制限を設定しています。
resources:
requests:
cpu: "500m"
memory: "128Mi"
limits:
cpu: "1"
memory: "256Mi"
私に質問をさせるのは PHP.netのドキュメント が言うことです:
memory_limit
整数これは、スクリプトが割り当てることができるメモリの最大量をバイト単位で設定します。これにより、サーバーで使用可能なすべてのメモリを使い果たすためのスクリプトの記述が不十分になるのを防ぐことができます。
php fpmは同時に多くのリクエストを処理でき、各リクエストは他から完全に独立したスクリプトを実行していると思います。 memory_limit
設定を共有しません。その場合、Kubernetesコンテナの制限はphpのmemory_limit
の設定よりも高くする必要がありますか?
わかりましたが、どのくらい高いのですか? cpu: 1
を制限すると、実際の並列処理は実行できなくなりますが、IOによってブロックされたときにOSが切り替えられて、CPUを共有する多くのプロセスがまだ存在する可能性があります。 fpm pm.max_children
設定は、実行できるスクリプトの数を教えてくれるので、最大でどれだけのメモリを使用できるかを教えてくれると思います。ただし、Kubernetes以外のセットアップでは、インスタンスのメモリ量に基づいてmax_children
を選択するため、ここで混乱が生じます。使用する式は次のとおりです。
max_children = (RAM - 2Gb) / 80Mb
# Where:
# * We Reserve 2Gb for the system.
# * We saw that each request needs on average 40Mb of memory, so we chose 80Mb to be safe.
RAMは実行時に規定されており、コンテナはphpのみを実行するため、システム用に予約する必要がないため、この方程式はKubernetesの世界では窓から外れます。
私は使用することを考えています:
memory_limit = 256M
max_children = 10
resources:
requests:
cpu: "500m"
memory: "512Mi"
limits:
cpu: "1"
memory: "2Gi"
OOMKilled
に設定します。制限を超えているためです。この考え方は合理的だと思いますか? 10人の子供が2Giの制限を必要とすることはほとんどないので、それが良いパッキングを可能にすることはないと思います。リソースが拡張されている場合、 [〜#〜] hpa [〜#〜] を使用してポッドを追加します。
Kubernetesのセットアップで何をしましたか?
コンテナリソースのリクエストと制限を設定することは、Kubernetesクラスタでリソースを効果的に使用するための最初のステップです。それらを設定した後、これらの値を調整する必要があるか、クラスターをアップグレードする必要があるかどうかを判断するために、監視とアラートが設定されていることを確認してください。コンテナでメモリ不足が発生した場合、カーネルは需要を満たすためにページキャッシュエントリを積極的に削除し、最終的にLinuxのメモリ不足(OOM)キラーによって強制終了される可能性があります。 K8sはスワップを無効にするため(dockerにmemory-swappiness = 0を渡すことにより)、設定ミスに対して非常に容赦のない環境です。
以下は、K8sの制限と理解を求めるために読むのに適した記事です。