[solved] Система не выделяет для mysqld более 2 Гб ОЗУ

Привет всем, собственно такой вот сабж, хз че делать...

О компе:

~ # uname -a
Linux sql 2.6.38-gentoo-r6 #1 SMP Sun Jun 26 22:26:32 MSD 2011 x86_64 Intel(R) Core(TM)2 Quad CPU Q9300 @ 2.50GHz GenuineIntel GNU/Linux

~ # free
             total       used       free     shared    buffers     cached
Mem:       8186520    8132192      54328          0      51412    5845260
-/+ buffers/cache:    2235520    5951000
Swap:      2000088      49296    1950792

 ~ # pmap -x 27024
27024:   /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --user=mysql --character-set-server=utf8 --key_buffer=2G --max_allowed_packet=2M --table_cache=800 --sort_buffer_size=2M --join_buffer_size=8200 --net_buffer_length=16K --read_buffer_size=8200 --read_rnd_buffer_size=2M --myisam_sort_buffer_size=128M --language=/usr/share/mysql/english --tmp_table_size=536870912 --max_heap_table_size=512M --thread_cache_size=80 --thread_concurrency=8 --query_cache_size=16M --query_cache_limit=5G --thread_stack=192K --
Address           Kbytes     RSS    Anon  Locked Mode   Mapping
0000000000400000    6668       -       -       - r-x--  mysqld
..................(вырезал большой кусок текста)....................
ffffffffff600000       4       -       -       - r-x--    [ anon ]
----------------  ------  ------  ------  ------
total kB         2246096

my.cnf

key_buffer                              = 2G
max_allowed_packet                      = 2M
table_cache                             = 800
sort_buffer_size                        = 2M
join_buffer_size                        = 8200
net_buffer_length                       = 16K
read_buffer_size                        = 8200
read_rnd_buffer_size                    = 2M
myisam_sort_buffer_size                 = 128M
language                                = /usr/share/mysql/english
tmp_table_size                          = 536870912
max_heap_table_size                     = 512M
thread_cache_size                       = 80
thread_concurrency                      = 8
query_cache_size                        = 16M
query_cache_limit                       = 5G
thread_stack                            = 192K
bulk_insert_buffer_size                 = 16K
#max_connections                        = 200
wait_timeout                            = 5000
concurrent_insert                       = 2

А в чем проблема? Выделенной

А в чем проблема? Выделенной памяти мало?
ulimit -a
sysctl -a | grep vm

taho написал(а): А в чем

taho написал(а):
А в чем проблема? Выделенной памяти мало?
ulimit -a
sysctl -a | grep vm

Ага... 2 Гб мало. База большая, юз активный, кэша недостаточно. ulimit я уже смотрел, там того что нужно нет. О sysctl

~ # sysctl -a | grep vm
vm.overcommit_memory = 0
vm.panic_on_oom = 0
vm.oom_kill_allocating_task = 0
vm.oom_dump_tasks = 1
vm.overcommit_ratio = 50
vm.page-cluster = 3
vm.dirty_background_ratio = 10
vm.dirty_background_bytes = 0
vm.dirty_ratio = 20
vm.dirty_bytes = 0
vm.dirty_writeback_centisecs = 500
vm.dirty_expire_centisecs = 3000
vm.nr_pdflush_threads = 0
vm.swappiness = 60
vm.lowmem_reserve_ratio = 256   256     32
vm.drop_caches = 0
vm.min_free_kbytes = 11495
vm.percpu_pagelist_fraction = 0
vm.max_map_count = 65530
vm.laptop_mode = 0
vm.block_dump = 0
vm.vfs_cache_pressure = 100
vm.legacy_va_layout = 0
vm.stat_interval = 1
vm.mmap_min_addr = 4096
vm.scan_unevictable_pages = 0

тоже не вижу ничего подходящего... Если решение там, подскажите точнее плиз, какой ключ дергать?

_Andrey написал(а):Ага... 2

_Andrey написал(а):
Ага... 2 Гб мало. База большая, юз активный, кэша недостаточно. ulimit я уже смотрел, там того что нужно нет. О sysctl

То есть тебе надо увиличить кеш мускула а не засрать максимально память программой?

Попробуй последовательно (не рывками) увеличить эти параметры:
key_buffer_size
query_cache_size
sort_buffer_size
read_buffer_size

taho написал(а): _Andrey

taho написал(а):
_Andrey написал(а):
Ага... 2 Гб мало. База большая, юз активный, кэша недостаточно. ulimit я уже смотрел, там того что нужно нет. О sysctl

То есть тебе надо увиличить кеш мускула а не засрать максимально память программой?

Попробуй последовательно (не рывками) увеличить эти параметры:
key_buffer_size
query_cache_size
sort_buffer_size
read_buffer_size

Благодарю за совет но я это уже делал и, к сожалению, безрезультатно... mysqld потребляет ровно 2 Гб и ни мегабайтом больше, какой бы размер кэша я не ставил. Ставлю меньше - все регулируется на ура, а вот больше не растет.
Я сильно подозреваю, что на самом деле система не выделяет программе более 2 Гб.

Посмотри внимательно на твою

Посмотри внимательно на твою конфигурацию mysql:
ты сделал key_buffer 2G, все остальные параметры просто "утонули" в виртуальном пространстве памяти выделенной для процесса, если ты сделаешь его 3G то и процесс увеличится на 3G ... но вот вопрос - зачем? То, что процесс занимает много памяти вовсе не означает что он будет работать лучше. Тюнинг обычно делают с умом на ходой конец как я - методом тыка (в научных кругах метода называется эмперической :)

А вы внимательно читали, что

А вы внимательно читали, что я писал выше? Мне неважно, сколько памяти занимает процесс, мне важно максимальное количество памяти, которое процесс сможет использовать под свои нужды. А процесс не может использовать более 2 Гб. И в том, что процесс перегружает жесткий диск, читая индексы и разбирая однотипные запросы (а и тех и других ооочень много), когда 5 Гб оперативы простаивают - в этом я определенно не вижу ничего хорошего. Так что не надо мне говорить "с умом", если не приводите реальные аргументы в эту пользу. Но спасибо, что еще раз обратили мое внимание на конфиг - именно там и крылась ошибка. query_cache_limit то я увеличил, а про query_cache_size - забыл :)
Так что проблема решена, всем спасибо.

>>в том, что процесс

>>в том, что процесс перегружает жесткий диск, читая индексы и разбирая однотипные запросы я определенно не вижу ничего хорошего

можно ssd прикупить, это как вариант

Ага хоть HBA+SAN связку

Ага хоть HBA+SAN связку только данные запросы лучше действительно кэшировать в памяти что и добивается афтар

_Andrey написал(а): А вы

_Andrey написал(а):
А вы внимательно читали, что я писал выше? Мне неважно, сколько памяти занимает процесс, мне важно максимальное количество памяти, которое процесс сможет использовать под свои нужды. А процесс не может использовать более 2 Гб. И в том, что процесс перегружает жесткий диск, читая индексы и разбирая однотипные запросы (а и тех и других ооочень много), когда 5 Гб оперативы простаивают - в этом я определенно не вижу ничего хорошего. Так что не надо мне говорить "с умом", если не приводите реальные аргументы в эту пользу. Но спасибо, что еще раз обратили мое внимание на конфиг - именно там и крылась ошибка. query_cache_limit то я увеличил, а про query_cache_size - забыл :)
Так что проблема решена, всем спасибо.

Ага внимательно: "Система не выделяет для mysqld более 2 Гб ОЗУ" - и это вся информация. А проблема в том что вы неправильно интерпретируете выхлоп pmap. pmap составляет карту виртуального пространства процесса и никоим образом она тождественно НЕ связана с оперативной памятью. Связь только через Memory Management Unit. Поэтому у вас за бортом вполне может остаться больше свободной памяти хотя pmap может указать выделенную виртуальную память более чем вся оператива.

Настройки просмотра комментариев

Выберите нужный метод показа комментариев и нажмите "Сохранить установки".