Previous Entry Share Next Entry
ну, раз пошла такая пьянка
1
white_thesis wrote in ru_mysql
режь последний огурец.
160626 14:23:52 [ERROR] \usr\local\mysql-5.5\bin\mysqld.exe: Out of memory (Needed 16384 bytes)

Напихал в машину оперативки до 4 гигабайт. Разрешил мускулю побольше.
key_buffer_size = 1G
max_allowed_packet = 8M
table_open_cache = 512
sort_buffer_size = 1G
read_buffer_size = 1G
read_rnd_buffer_size = 256M
myisam_sort_buffer_size = 1G
thread_cache_size = 64
query_cache_size = 256M

Фактически mysqld не занимает более 1 гига, в машине еще полтора-два свободно.
Тем не менее постоянно вижу в журнале такую ошибку.

Что забавно: при попытке перекинуть данные из таблицы (большой) в другую
insert into tbl1 select * from tbl0
появляется _ошибка_ out of memory и операция сбрасывается.
А вот при сортировке или перестройке индексов эти ошибки пишутся в журнал именно как ERROR, но учитываются как предупреждения - warnings.

Можно как-нибудь понять кому и для чего не хватает памяти?

UPD. Что-то здесь концы с концами не сходятся
Взял из комплекта "денвера" конфиг мускуля
# This is for a large system with memory of 1G-2G where the system runs mainly
# MySQL.
key_buffer_size = 512M
max_allowed_packet = 4M
table_open_cache = 512
sort_buffer_size = 256M
read_buffer_size = 256M
read_rnd_buffer_size = 256M
myisam_sort_buffer_size = 512M
thread_cache_size = 64
query_cache_size = 256M

В машине 4 гига, кроме мускуля ничего не запущено. Ну, подойдет.
Объем памяти, занимаемой mysqld, не превыcил 800М. Хотя уже сообразно конфигу должно быть больше.
В машине еще 2 гига свободной оперативки.
Однако же "out of memory error".

Ладно, берем из того же комплекта другой образец.
# This is for a large system with memory = 512M where the system runs mainly
# MySQL.
key_buffer_size = 256M
max_allowed_packet = 1M
table_open_cache = 256
sort_buffer_size = 1M
read_buffer_size = 1M
read_rnd_buffer_size = 4M
myisam_sort_buffer_size = 64M
thread_cache_size = 8
query_cache_size= 16M

Таки key_buffer_size=256M. Надо ожидать, что mysqld будет не меньше. Однако же размер mysqld жестко ограничивается 80М и все работает феноменально медленно.
Ну то есть вообще неприемлемо. Поставил таблицу на сортировку. 120М строк. Пришел на следующий день - едва ли на 3/4 выполнено.

Поднял немного лимиты.
key_buffer_size = 256M
max_allowed_packet = 2M
table_open_cache = 256
sort_buffer_size = 4M
read_buffer_size = 4M
read_rnd_buffer_size = 4M
myisam_sort_buffer_size = 128M
thread_cache_size = 8
query_cache_size= 16M

Запрос "insert into p2 select * from parts order by de_mas, ra_mas;"
Пока идет выборка и сортировка show processlist -> sorting result - памяти забирает примерно 80-90 М. На этапе внесения в новую таблицу - уже 1.5G и похоже, что этим не ограничится.

  • 1
4G на всё? Курим ман на тему сессионных переменных и буферов, выделяющихся под конкретную операцию.

key_buffer_size, query_cache_size у вас всегда выеделен
sort_buffer_size выделяется для *каждой* сортировки
read_buffer_size для каждого сканирования таблицы MyISAM (select * - вот это)
read_rnd_buffer_size, myisam_sort_buffer_size - по необходимости

То есть каждый из проблемных запросов у вас использует 2G, всё время выделено 1,25G плюс легко ещё 1,25G может выделиться. Не нужно сессионные буферы по умолчанию большими делать. Выделяйте в сессии под конкретный запрос.

  • 1
?

Log in

No account? Create an account