Назад | Перейти на главную страницу

mysqld.service для systemd - Не удалось проанализировать значение ресурса, игнорируется: 40000 - LimitMEMLOCK

Я получил эту ошибку mysql systemd[1]: [/usr/lib/systemd/system/mysqld.service:39] Failed to parse resource value, ignoring: 40000 на Centos 7 с mysql 5.7, когда я установил LimitMEMLOCK предел для MYSQL 5.7.

LimitMEMLOCK=40000
  1. Почему невозможно установить числовой предел для LimitMEMLOCK?
  2. Какова цель LimitMEMLOCK ?
  3. Единственная душа LimitMEMLOCK=infinity?

*

#cat /etc/*-release
CentOS Linux release 7.3.1611 (Core)
NAME="CentOS Linux"
VERSION="7 (Core)"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="7"
PRETTY_NAME="CentOS Linux 7 (Core)"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:centos:centos:7"
HOME_URL="https://www.centos.org/"
BUG_REPORT_URL="https://bugs.centos.org/"

CENTOS_MANTISBT_PROJECT="CentOS-7"
CENTOS_MANTISBT_PROJECT_VERSION="7"
REDHAT_SUPPORT_PRODUCT="centos"
REDHAT_SUPPORT_PRODUCT_VERSION="7"

CentOS Linux release 7.3.1611 (Core)
CentOS Linux release 7.3.1611 (Core)

*

service mysqld status
Redirecting to /bin/systemctl status  mysqld.service
● mysqld.service - MySQL Server
   Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; vendor preset: disabled)
   Active: active (running) since Mon 2016-12-19 23:21:24 UTC; 9s ago
 Main PID: 11170 (mysqld)
   CGroup: /system.slice/mysqld.service
           └─11170 /usr/sbin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid

mysql systemd[1]: Starting MySQL Server...
mysql mysqld_pre_systemd[11143]: /usr/sbin/restorecon:  Warning no default label for /mnt/data/mysql
mysql systemd[1]: Started MySQL Server.
mysql systemd[1]: [/usr/lib/systemd/system/mysqld.service:39] Failed to parse resource value, ignoring: 40000

Я не вижу этого сообщения об ошибке в другой версии Centos 7 (CentOS Linux release 7.2.1511 (Core)) когда mysqld.service настроить с LimitMEMLOCK=40000.

cat /etc/*-release
CentOS Linux release 7.2.1511 (Core)
NAME="CentOS Linux"
VERSION="7 (Core)"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="7"
PRETTY_NAME="CentOS Linux 7 (Core)"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:centos:centos:7"
HOME_URL="https://www.centos.org/"
BUG_REPORT_URL="https://bugs.centos.org/"

CENTOS_MANTISBT_PROJECT="CentOS-7"
CENTOS_MANTISBT_PROJECT_VERSION="7"
REDHAT_SUPPORT_PRODUCT="centos"
REDHAT_SUPPORT_PRODUCT_VERSION="7"

CentOS Linux release 7.2.1511 (Core)
CentOS Linux release 7.2.1511 (Core)

Начнем с документация по systemd:

LimitCPU=, LimitFSIZE=, LimitDATA=, LimitSTACK=, LimitCORE=, LimitRSS=, LimitNOFILE=, LimitAS=, LimitNPROC=, LimitMEMLOCK=, LimitLOCKS=, LimitSIGPENDING=, LimitMSGQUEUE=, LimitNICE=, LimitRTPRIO=, LimitRTTIME=

Установите мягкие и жесткие ограничения на различные ресурсы для выполняемых процессов. Видеть setrlimit (2) для получения подробной информации о концепции ограничения ресурсов.

Для MEMLOCK эта страница руководства объясняет:

   RLIMIT_MEMLOCK
          The maximum number of bytes of memory that may be locked into
          RAM.  In effect this limit is rounded down to the nearest
          multiple of the system page size.  This limit affects mlock(2)
          and mlockall(2) and the mmap(2) MAP_LOCKED operation.  Since
          Linux 2.6.9 it also affects the shmctl(2) SHM_LOCK operation,
          where it sets a maximum on the total bytes in shared memory
          segments (see shmget(2)) that may be locked by the real user
          ID of the calling process.  The shmctl(2) SHM_LOCK locks are
          accounted for separately from the per-process memory locks
          established by mlock(2), mlockall(2), and mmap(2) MAP_LOCKED;
          a process can lock bytes up to this limit in each of these two
          categories.

          In Linux kernels before 2.6.9, this limit controlled the
          amount of memory that could be locked by a privileged process.
          Since Linux 2.6.9, no limits are placed on the amount of
          memory that a privileged process may lock, and this limit
          instead governs the amount of memory that an unprivileged
          process may lock.

Блокировка памяти в ОЗУ не позволяет ядру выгружать ее. Это делается не часто, но для некоторых вещей, критичных к производительности, это весьма полезно. Базы данных - одна из тех вещей, которые могут это эффективно использовать.

Установка этого значения на 40000 не имеет смысла. Даже если бы вы могли это сделать, это привело бы к повреждению базы данных и, вероятно, к ее сбою. MySQL блокирует память, когда поддержка больших страниц включен, и в документации указано, что блокировка памяти должна быть неограниченной (infinity в вашем модуле systemd).