MySQL — [Warning] Changed limits: max_open_files, table_open_cache

Thank you for reading this post, don't forget to subscribe!

Прак­ти­че­ски все­гда стал­ки­ва­юсь с пре­ду­пре­жде­ни­ем Mysql сер­ве­ра, когда опти­ми­зи­рую рабо­ту сай­тов на Bitrix, рабо­та­ю­щих в окру­же­нии bitrixenv.

настрой­ках Mysql сер­ве­ра есть два очень важ­ных пара­мет­ра, кото­рые вли­я­ют на его производительность:

  • table_open_cache
  • open_files_limit

Какие зна­че­ния нуж­но выби­рать, тема отдель­ной ста­тьи и силь­но зави­сит от кон­крет­ной ситу­а­ции, так что сей­час не об этом. Допу­стим, вы выста­ви­ли эти зна­че­ния в 15000 и 30000 соот­вет­ствен­но. При запус­ке Mysql сер­ве­ра вы уви­ди­те в логе для оши­бок сле­ду­ю­щие строки:

Mysql сер­вер не может выста­вить ука­зан­ные пара­мет­ры. При­чи­на это­го — лимит опе­ра­ци­он­ной систе­мы для кон­крет­но­го про­цес­са, в дан­ном слу­чае mysql. Посмот­реть его лими­ты мож­но командой:

Bitrixenv ста­вит зна­че­ние Max open files в 5000 для служ­бы базы дан­ных. По дефол­ту в Centos 7 оно рав­но 1024 на про­цесс. Нам это­го мало, поэто­му уве­ли­чи­ва­ем его кон­крет­но для mysql до 65535. Для это­го созда­ем отдель­ный кон­фиг в systemd для служ­бы mysql.

Содер­жи­мое фай­ла очень простое:

Объ­яс­няю, поче­му мы сде­ла­ли имен­но так. По идее, мож­но было бы про­сто отре­дак­ти­ро­вать файл /etc/systemd/system/mysql.service. Там уже есть пара­метр LimitNOFILE и ему ука­за­но зна­че­ние 5000. Но если мы отре­дак­ти­ру­ем его, то изме­не­ние будет сбро­ше­но при оче­ред­ном обнов­ле­нии mysql сер­ве­ра. А создав отдель­ный внеш­ний кон­фиг для служ­бы, мы обез­опа­си­ли его от изме­не­ния. Теперь мож­но спо­кой­но обнов­лять­ся, уста­нов­лен­ный пара­метр нику­да не денется.

Так же мож­но было изме­нить систем­ные лими­ты для всех про­цес­сов разом, через ука­за­ние нуж­но­го пара­мет­ра в кон­фи­гу­ра­ци­он­ном фай­ле /etc/security/limits.conf. До появ­ле­ния systemd так обыч­но и дела­ли. С появ­ле­ни­ем послед­не­го управ­лять лими­та­ми для про­цес­сов ста­ло про­ще, поэто­му луч­ше настра­и­вать все точеч­но имен­но там, где это необходимо.

После изме­не­ния кон­фи­гу­ра­ци­он­ных фай­лов systemd, надо пере­чи­тать настройки:

И пере­за­пус­ка­ем Mysql для при­ме­не­ния изме­не­ний в самой службе.

Про­ве­ряй­те лог mysql. Боль­ше пре­ду­пре­жде­ния на тему Changed limits быть не долж­но. Смотрим.