Povećavanje ulimit-a i open_files_limit MySQLi/MariaDB na Cloud/VPS

Šta je Ulimit?

Limite možete proveriti sa ulimit -a

Ukoliko želimo da proverimo limite za određeni servis, npr MySQL

sudo -H -umysql bash -c \"ulimit -n\"

Postoje Soft i Hard limiti. Soft limite proces može samostalno povećati dok Hard limite može povećati samo root.

Ukoliko je limit 1024 to znači da proces može otvoriti maksimalno 1024 fajla.

Ukoliko proces prekorači ove limite open, pipe i dup sistemski pozivi će biti neuspešni.

Što je u mom slučaju dovelo do pada MySQL (MariaDB) zato je ovaj post prvenstveno posvećen problemu koji MySQL može da ima.

Ovo je karakteristično za VPS i CLOUD okruženja jer na dedicated serverima ovi limiti su podrazumevno veći.

MySQL ne(voli) limite

Output za: service mariadb status

jan 08 16:04:11 mario systemd[1]: Starting MariaDB 10.1.30 database server...
jan 08 16:04:11 mario mysqld[2614]: 2018-01-08 16:04:11 139937944729856 [Note] /usr/sbin/mysqld (mysqld 10.1.30-MariaDB) starting as process 2614 ...
jan 08 16:04:11 mario mysqld[2614]: 2018-01-08 16:04:11 139937944729856 [Warning] Could not increase number of max_open_files to more than 16000 (request: 16211)
jan 08 16:04:14 mario systemd[1]: Started MariaDB 10.1.30 database server.

S obzirom da systemd kod najnovijih distribucija više ne ferma /etc/security/limits.conf ni 2% neophodno je limite promeniti dodavanjem sopstvenih konfiguracionih fajlova za servis.

Ali zbog dobre prakse podićićemo limite i u /etc/security/limits.conf reda radi

Izmenite fajl vi /etc/security/limits.conf

Na dnu dodajte

mysql soft nofile 65535
mysql hard nofile 65535

Napravićemo novi fajl

vi /etc/systemd/system/mysqld.service.d/limits.conf

Dodajte

[Service]
LimitNOFILE=infinity
LimitMEMLOCK=infinity

Primenimo podešavanja

systemctl daemon-reload

E sad ukoliko vam se nakon ovoga desi da limiti nisu primenjeni odnosno da ponovo imate problem, što se meni dogodilo, to znači da postoji još neki prilagođeni konfiguracioni fajl.
U mom slučaju nakon nadogradnje na MariaDB putem WHM interfejsa cPanel je dodao fajl /etc/systemd/system/mariadb.service.d/migrated-from-my.cnf-settings.conf u kome su LimitNOFILE i LimitMEMLOCK bili definisani po uzoru na my.cnf a s obzirom da sam limite u međuvremenu povećao… tu je nastao problem.
Ovaj fajl možete da obrišete.

Ukoliko koristite MariaDB da li ćete fajl dodati u /etc/systemd/system/mariadb.service.d/ ili /etc/systemd/system/mysql.service.d/ svejedno je.
Ukoliko koristite MySQL onda to može samo biti /etc/systemd/system/mysql.service.d/

Sada proverimo limite preko mysql konzole

MariaDB [(none)]> show global variables like \’open%\’;
+——————+——-+
| Variable_name | Value |
+——————+——-+
| open_files_limit | 65536 |
+——————+——-+
1 row in set (0.00 sec)

I putem

[root@mario ~]# sudo -H -umysql bash -c \”ulimit -n\”
65535