FreeBSD: изменение лимитов для выполняемых процессов

На днях на одном из серверов под управление FreeBSD 6.2 возникла необходимость увеличить параметры буферов в mysql, в частности

innodb_buffer_pool_size = 512M
myisam_sort_buffer_size = 512M

Однако, после перезапуска сервиса в лог-файле появились следующие ошибки

120124 18:34:20 InnoDB: Error: cannot allocate 536887296 bytes of
InnoDB: memory with malloc! Total allocated memory
InnoDB: by InnoDB 3797744 bytes. Operating system errno: 12
InnoDB: Check if you should increase the swap file or
InnoDB: ulimits of your operating system.
InnoDB: On FreeBSD check you have compiled the OS with
InnoDB: a big enough maximum process size.
InnoDB: Note that in most 32-bit computers the process
InnoDB: memory space is limited to 2 GB or 4 GB.
InnoDB: We keep retrying the allocation for 60 seconds...
InnoDB: Fatal error: cannot allocate the memory for the buffer pool

Анализ конфигурации сервера показал что на сервере установлены лимиты на выделенные ресурсы для процессов

# limits
Resource limits (current):
  cputime          infinity secs
  filesize         infinity kB
  datasize           524288 kB
  stacksize           65536 kB
  coredumpsize     infinity kB
  memoryuse        infinity kB
  memorylocked     infinity kB
  maxprocesses         5547
  openfiles           11095
  sbsize           infinity bytes
  vmemoryuse       infinity kB

Решено было увеличить доступные ресурсы для mysql до 2Гб. Для этого добавил в /boot/loader.conf следующие параметры:

kern.maxdsiz=2147483648
kern.dfldsiz=2147483648
kern.maxssiz=2147483648

После перезагрузки сервера картина поменялась в нужную сторону

# limits
Resource limits (current):
  cputime          infinity secs
  filesize         infinity kB
  datasize          2097152 kB
  stacksize         2097152 kB
  coredumpsize     infinity kB
  memoryuse        infinity kB
  memorylocked     infinity kB
  maxprocesses         5547
  openfiles           11095
  sbsize           infinity bytes
  vmemoryuse       infinity kB

Однако не очень хорошо, что всем пользователям доступны такие ресурсы, поэтому ограничиваем всех, кроме root и mysql.
Для начала поменяем класс у пользователя mysql, используя команду:

# chfn mysql
 
#Changing user information for mysql.
Login: mysql
Password: *
Uid [#]: 88
Gid [# or name]: 88
Change [month day year]:
Expire [month day year]:
Class: mysql
Home directory: /nonexistent
Shell: /sbin/nologin
Full Name: MySQL Daemon
Office Location:
Office Phone:
Home Phone:
Other information:

и изменяем поле Class: на Class: mysql, сохраняем изменение и переходим к непосредственному редактированию лимитов.
За лимиты отвечает файл /etc/login.conf. В нем в секции default:\ меняем параметр :datasize=unlimited:\ на :datasize=256M:\ и добавляем новый класс для mysql

mysql:\
        :datasize=infinity:\
        :tc=default:

Сохраняем сделанные изменения, не забываем перестроить базу командой cap_mkdb /etc/login.conf и проверяем как работают ограничения.

# limits
Resource limits (current):
  cputime          infinity secs
  filesize         infinity kB
  datasize          2097152 kB
  stacksize         2097152 kB
  coredumpsize     infinity kB
  memoryuse        infinity kB
  memorylocked     infinity kB
  maxprocesses         5547
  openfiles           11095
  sbsize           infinity bytes
  vmemoryuse       infinity kB
 
# limits -U mysql
Resource limits for class mysql:
  cputime          infinity secs
  filesize         infinity kB
  datasize         infinity kB
  stacksize        infinity kB
  coredumpsize     infinity kB
  memoryuse        infinity kB
  memorylocked     infinity kB
  maxprocesses     infinity
  openfiles        infinity
  sbsize           infinity bytes
  vmemoryuse       infinity kB
 
# limits -U user
Resource limits for class default:
  cputime          infinity secs
  filesize         infinity kB
  datasize           262144 kB
  stacksize        infinity kB
  coredumpsize     infinity kB
  memoryuse        infinity kB
  memorylocked     infinity kB
  maxprocesses     infinity
  openfiles        infinity
  sbsize           infinity bytes
  vmemoryuse       infinity kB

Теперь mysql может использовать все возможные ресурсы в рамках общего лимита системы.

Комментарии запрещены.