KUSANAGIのチューニング設定を調査

KUSANAGIを試したときにチューニング設定がとても勉強になるなぁと思って調査したときの覚書。

環境: ConoHa VPS メモリ8G/CPU6コア、KUSANAGI Version 9.4.12-1.el9

設定項目を1つずつ調査して意味を理解していく。


PHPのチューニング設定

PHPの設定確認。
# cd /etc/opt/kusanagi/
# less php.d/php.ini

post_max_size = 16M ;POSTメソッドの最大サイズ
upload_max_filesize = 16M ;アップロードされるファイルの最大サイズ
date.timezone = UTC ;タイムゾーン。"Asia/Tokyo"に変更

php-fpmの設定を確認。
参考: PHP: 設定 - Manual
# less php-fpm.d/www.conf

user = httpd
group = www
listen = 127.0.0.1:9000 ;unix socketに変更

pm.start_servers = 10 ;プロセス開始時のプロセス数
pm.min_spare_servers = 5 ;待ち状態の最小プロセス数
pm.max_spare_servers = 15 ;待ち状態の最大プロセス数
pm.max_requests = 500 ;再起動するまでの実行リクエスト数

slowlog = /var/opt/kusanagi/log/php-fpm/www-slow.log
request_slowlog_timeout = 10
request_terminate_timeout = 180

catch_workers_output = yes ;ワーカーの標準出力を本体にリダイレクト
decorate_workers_output = no ;ワーカーの標準出力の文字装飾
clear_env = no ;FPM ワーカー内の環境をクリア

php_admin_value[error_log] = /var/opt/kusanagi/log/php-fpm/www-error.log
php_admin_flag[log_errors] = on
php_value[session.save_handler] = files
php_value[session.save_path]    = /var/opt/kusanagi/lib/php/session
php_value[soap.wsdl_cache_dir]  = /var/opt/kusanagi/lib/php/wsdlcache


Nginxのチューニング設定

Nginxの設定確認。
参考: Core functionality
# cd /etc/opt/kusanagi/nginx/
# less nginx.conf

user httpd www;
worker_processes  auto;
worker_rlimit_nofile  20000; workerプロセスの最大オープンファイル数の上限

pcre_jit on; 正規表現のJITコンパイル

events {
    worker_connections 4096; 1つのworkerプロセスが開ける最大コネクション数
    multi_accept on; 一つのワーカープロセスを集中して使うようになる
    use epoll; コネクションの処理方法
}

http {
    server_tokens off; レスポンスヘッダーにサーバー情報を表示しない
    server_names_hash_bucket_size 128; server_nameが長くても大丈夫にする
    limit_req_zone $remote_addr$http_x_forwarded_for zone=one:10m rate=100r/s; IPアドレスごとに1秒間に100リクエストの制限。

    client_max_body_size     20M; リクエストの最大サイズ
    client_body_buffer_size 768k; メモリ上のバッファに読み込む最大リクエストサイズ
    sendfile    on; sendfile()を使うかどうか
    tcp_nopush  on; sendfileがon時にレスポンスヘッダとファイルの内容をまとめて送る
    tcp_nodelay on; バッファリングを無効にして遅延を最小化
    keepalive_timeout 5; 通信を持続する秒数
    connection_pool_size 1024; 接続あたりのメモリの割り当て
    request_pool_size 8k; リクエストあたりのメモリの割り当て

    gzip on;
    gzip_http_version 1.0;
    gzip_disable "msie6";
    gzip_proxied any;
    gzip_min_length 1024;
    gzip_comp_level 2;
    gzip_types text/plain text/css application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript application/json; text/html以外に圧縮する形式

    brotli on; gzipと同等レベルの速度で高圧縮率な圧縮アルゴリズム
    brotli_static on;
    brotli_types text/plain text/css application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript application/json;
    brotli_comp_level 3;
    brotli_min_length 1024;

    open_file_cache max=100000 inactive=20s; ファイルのメタデータをキャッシュする
    open_file_cache_valid 30s;
    open_file_cache_min_uses 2;
    open_file_cache_errors on;
    fastcgi_cache_path /var/opt/kusanagi/cache/nginx/wordpress levels=1:2 keys_zone=wpcache:30m max_size=512M inactive=600m;
    fastcgi_ignore_headers "Vary" "Cache-Control" "Expires";
}

conf.dにある設定ファイルの書き方も参考になる。

ちなみにWordPress公式サイトとMozillaのnginx設定例はこちら。


MariaDBのチューニング設定

MariaDBはリポジトリで配信されているものを使っている。
# cd /etc/my.cnf.d/
# less server.cnf

[mysqld]
character_set_server = utf8mb4
max_connections = 900
thread_cache_size = 300
table_cache = 256
max_allowed_packet = 16M
query_cache_size = 320M
tmp_table_size = 32M
max_heap_table_size = 32M
thread_stack = 512K
max_statement_time = 3600

key_buffer_size = 32M
sort_buffer_size = 2M
read_buffer_size = 2M
read_rnd_buffer_size = 1M
join_buffer_size = 1M

myisam_sort_buffer_size = 1M
bulk_insert_buffer_size = 1M

innodb_buffer_pool_size = 3072M
#innodb_log_file_size = 32M     # 48M -10.4, 96M 10.5-
#innodb_use_sys_malloc = 1      # DEPRECATED in 10.2
innodb_thread_concurrency = 8

log-error = /var/log/mysql/mysqld.log
log-warnings = 1

slow_query_log = 1
slow_query_log_file = "/var/log/mysql/slow.log"
long_query_time = 1.2

意外に「thread_handling = pool-of-threads」が設定されていなかった。


【関連記事】