はじめに
運用環境で処理に遅延が発生した際、開発環境では再現が難しい場合があります。
そんなときに便利な、PHPやMySQL(MariaDB)をお手軽に遅くする方法です。
(Linux上で動作しているPHPを前提として書いてます)
CPUクォータ を設定して遅くする
PHP
下記コマンドでCPUの割り当てを「5%」に変更します。
(約1/20程度の速度になる)
# mpm_prefork の場合
$ sudo systemctl set-property --runtime httpd.service CPUQuota=5%
# PHP-FPM 利用時
$ sudo systemctl set-property --runtime php-fpm.service CPUQuota=5%
-
--runtime
を指定しない場合は、設定が永続化されます
(--runtime
を付けた場合は、OSの再起動で設定がリセットされます)
MySQL(MariaDB)
# MariaDB の場合
$ sudo systemctl set-property --runtime mariadb.service CPUQuota=5%
# MySQL の場合
$ sudo systemctl set-property --runtime mysqld.service CPUQuota=5%
戻し方
OSを再起動すれば元に戻ります。
もしくはCPUQuota=100%
で上書きすることでも元に戻ります。
効果
Apacheのアクセスログで処理にかかった時間を計測
PHP、DB共にCPUQuota=5%とした場合、ちょうど20倍の時間がかかりました。
変更前
- 平均: 180ms
変更後 - 平均: 3600ms
ちょっと解説
systemdにコントロールグループ(cgroup)が組み込まれており、リソースを動的に変更する仕組みがあるためその機能を利用しています。
動的に変更した値は下記の手順で調べることができます。
systemctl show httpd | grep DropInPaths
DropInPaths=/run/systemd/system/httpd.service.d/50-CPUQuota.conf
DropInPaths
はユニットファイルの設定を上書きするための値を記述したファイルのパス(スペース区切りで複数)
cat /run/systemd/system/httpd.service.d/50-CPUQuota.conf
[Service]
CPUQuota=5%
ファイルを開くと設定が記述されています。
/run
は、tmpfs としてマウントされているため、再起動時に消えます(メモリ上に保持されるファイルシステム)
ディスクIO帯域幅制限
ディスクIOを制限することもできます。
(ただし、DBにはバッファキャッシュやクエリキャッシュがあるので効果がまちまちでした)
# MariaDB の場合
$ sudo systemctl set-property --runtime mariadb.service BlockIOReadBandwidth="/dev/vda 100K"
/dev/vda
の部分はマウントしているディスクのデバイス名を指定します。
100Kの部分はKB/sです。
環境により変わるためlsblk
等で確認して設定してください。
lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sr0 11:0 1 1024M 0 rom
vda 253:0 0 200G 0 disk
├─vda1 253:1 0 1M 0 part
├─vda2 253:2 0 500M 0 part /boot
├─vda3 253:3 0 4G 0 part [SWAP]
└─vda4 253:4 0 195.5G 0 part /
参考