mariadbでsleepのプロセスが多くToo many open filesの対応


かたわらで起こってた事件の調査をざっくりした備忘録です。
ここに書いてるほかにはコネクションプーリングをクライアント側アプリで実装するとかかと思われ。

sleepが多い件

wait_timeoutを短く、という記事が散見された。(set globalでオンライン更新可能)
MySQLでToo many connectionsが起きた場合の対処方法 - わかりやすい
システム開発の備忘録 | MySQL - sleepプロセスが溜まる

すでに結構短いな↓と思ったらもともと60だったのを相談して40にしてた模様。
 →show full proccesslist;見た感じはsleepは600越えだったものの
  replication以外のユーザが40秒以上sleepしてるプロセスはなかった
  show global status;でMax_userd_connectionsは増えてなさそうで
  thread_cache_sizeとmax_connectionsは足りてそうだった
  →ほかのタイムアウト値を調整しなくても大丈夫そう

MariaDB [(none)]> show global variables like '%timeout%';
+----------------------------+----------+
| Variable_name              | Value    |
+----------------------------+----------+
| connect_timeout            | 10       |
| deadlock_timeout_long      | 50000000 |
| deadlock_timeout_short     | 10000    |
| delayed_insert_timeout     | 300      |
| innodb_lock_wait_timeout   | 50       |
| innodb_rollback_on_timeout | OFF      |
| interactive_timeout        | 28800    |
| lock_wait_timeout          | 31536000 |
| net_read_timeout           | 30       |
| net_write_timeout          | 60       |
| slave_net_timeout          | 30       |
| thread_pool_idle_timeout   | 60       |
| wait_timeout               | 40       |
+----------------------------+----------+
13 rows in set (0.01 sec)

ちなみに本家の5.7だとmax_execution_timeというパラメータがありサーバサイドでクエリのタイムアウトを設定可能な模様。

詳解MySQL 5.7 止まらぬ進化に乗り遅れないためのテクニカルガイド(奥野幹也) | 翔泳社の本

しかしmariadbでは10.1でも設定できない模様↓。

System Variable Differences Between MariaDB 10.1 and MySQL 5.7 - MariaDB Knowledge Base

Too many open files対策

エラーログに出てた件。
いまは出てないけど念のためlimitを無限にしたらいいのではと。

MariaDB on CentOS 7 - "Error in accept: Too many open files"

CentOS7なので
/usr/lib/systemd/system/mariadb.service
の[service]セクションに以下を追加してsystemctlデーモンをリロードしてmariadbプロセスをリスタートする
LimitNOFILE=infinity

mysqltuner

`query_cache_limit (> 1M, or use smaller result sets)`

   →DBのキャッシュはほとんど使ってなさそうでlimit減らしてはどうか

`innodb_buffer_pool_instances(=22)`

   →innodb_buffer_pool_sizeを1GBで割った商にすると効率よいとマニュアルにある
    MySQL :: MySQL 5.6 リファレンスマニュアル :: 14.13.1.4 複数のバッファープールインスタンスの使用
    この値は5.6では動的変更はいいえで変えるならmy.cnfに追記してmariadbの再起動が必要。
    MySQL :: MySQL 5.6 リファレンスマニュアル :: 14.12 InnoDB の起動オプションおよびシステム変数

show global status;でざっくり確認

Created_tmp_disk_tables

Sort_merge_passes
とかの致命的なやつは0だったのでまあ大丈夫かなと思った

http://dbstudy.info/files/20130318/tuningathon5_mysql56.pdf
http://qiita.com/tyoro/items/5436a5172b547e5e52f5

コネクションプールは商用版になんかあった気がするなと思って検索した。↓これですかね。
MySQL :: MySQL Enterprise Scalability

以上。