Любой кто настраивал сервер базы данных Mysql знает про замечательный скрипт для проверки и выдачи рекомендаций по настройке параметров mysqltunner.pl. Однако слепо доверять ему не стоит, так как этот скрипт не смотрит на то сколько у вас в наличии оперативной памяти, как у вас с потреблением этой памяти другими процессами и т.д. Таким образом настройка может вылиться в неумеренное потребление памяти сервером mysql.
Я для эксперимента настроил сервер по рекомендациям mysqltunner.pl и получил максимальное потребление более 10 гигабайт. Такими виртуальными машинами я не владею, и как результат — OOM-killer постоянно убивал жиреющий процесс mysql-сервера.
Учитывая что параметров для тюнинга в MySQL полным-полно, подсчитать сколько же памяти она будет есть в минимальной и максимальной нагрузке — довольно трудно.
Однако, я набрел на просторах интернета на скрипт который сделает подсчет за вас.
#!/bin/sh # you might want to add some user authentication here mysql -u user -ppassword -e "show variables; show status" | awk ' { VAR[$1]=$2 } END { MAX_CONN = VAR["max_connections"] MAX_USED_CONN = VAR["Max_used_connections"] BASE_MEM=VAR["key_buffer_size"] + VAR["query_cache_size"] + VAR["innodb_buffer_pool_size"] + VAR["innodb_additional_mem_pool_size"] + VAR["innodb_log_buffer_size"] MEM_PER_CONN=VAR["read_buffer_size"] + VAR["read_rnd_buffer_size"] + VAR["sort_buffer_size"] + VAR["join_buffer_size"] + VAR["binlog_cache_size"] + VAR["thread_stack"] + VAR["tmp_table_size"] MEM_TOTAL_MIN=BASE_MEM + MEM_PER_CONN*MAX_USED_CONN MEM_TOTAL_MAX=BASE_MEM + MEM_PER_CONN*MAX_CONN printf "+------------------------------------------+--------------------+n" printf "| %40s | %15.3f MB |n", "key_buffer_size", VAR["key_buffer_size"]/1048576 printf "| %40s | %15.3f MB |n", "query_cache_size", VAR["query_cache_size"]/1048576 printf "| %40s | %15.3f MB |n", "innodb_buffer_pool_size", VAR["innodb_buffer_pool_size"]/1048576 printf "| %40s | %15.3f MB |n", "innodb_additional_mem_pool_size", VAR["innodb_additional_mem_pool_size"]/1048576 printf "| %40s | %15.3f MB |n", "innodb_log_buffer_size", VAR["innodb_log_buffer_size"]/1048576 printf "+------------------------------------------+--------------------+n" printf "| %40s | %15.3f MB |n", "BASE MEMORY", BASE_MEM/1048576 printf "+------------------------------------------+--------------------+n" printf "| %40s | %15.3f MB |n", "sort_buffer_size", VAR["sort_buffer_size"]/1048576 printf "| %40s | %15.3f MB |n", "read_buffer_size", VAR["read_buffer_size"]/1048576 printf "| %40s | %15.3f MB |n", "read_rnd_buffer_size", VAR["read_rnd_buffer_size"]/1048576 printf "| %40s | %15.3f MB |n", "join_buffer_size", VAR["join_buffer_size"]/1048576 printf "| %40s | %15.3f MB |n", "thread_stack", VAR["thread_stack"]/1048576 printf "| %40s | %15.3f MB |n", "binlog_cache_size", VAR["binlog_cache_size"]/1048576 printf "| %40s | %15.3f MB |n", "tmp_table_size", VAR["tmp_table_size"]/1048576 printf "+------------------------------------------+--------------------+n" printf "| %40s | %15.3f MB |n", "MEMORY PER CONNECTION", MEM_PER_CONN/1048576 printf "+------------------------------------------+--------------------+n" printf "| %40s | %18d |n", "Max_used_connections", MAX_USED_CONN printf "| %40s | %18d |n", "max_connections", MAX_CONN printf "+------------------------------------------+--------------------+n" printf "| %40s | %15.3f MB |n", "TOTAL (MIN)", MEM_TOTAL_MIN/1048576 printf "| %40s | %15.3f MB |n", "TOTAL (MAX)", MEM_TOTAL_MAX/1048576 printf "+------------------------------------------+--------------------+n" }'
Тут всё просто. Создаете файл, например mysql_show_mem.sh, кидаете в него то что приведено выше, если надо — добавляете аутентификацию пользователя (в коде выше указан пользователь root с паролем password). Даёте права на запуск скрипта и выполняете его. Будет выглядеть примерно так:
На скриншоте видно — сколько минимум и максимум памяти будет использовать ваш MySQL сервер