LoginSignup
4
1

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-12-20

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

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

以上。

4
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1