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 может использовать все возможные ресурсы в рамках общего лимита системы.