LINUX.ORG.RU
ФорумAdmin

Mysqld жрет swap при свободной RAM

 , , , ,


0

1

Привет, камрады.

Имеется проблема: subj

Что заметили - проблема проявляется при использовании использовании binlog.

При этом несколько серваков попадает под раздачу, с разной топологией:

 M -- M -- S

 M -- S
 |
 |
 S

и так далее. Это всегда slave. Были мысли, что в один момент Mysqld не хватает памяти и идет в своп, но нет - метрики говорят, что использование памяти всегда постоянно (выхлоп ниже).

Рестарт mysqld помогает ненадолго и снова имеем такую же картину.

База работает на одно приложение, размер базы маленький - 30 Гб. LA околонулевые, iostat предоставлен ниже

[me ~]$ cat /etc/redhat-release 
CentOS Linux release 7.6.1810 (Core) 

Версия мускуля:

5.7.25

Выхлоп free:

[me ~]$ free -h
              total        used        free      shared  buff/cache   available
Mem:            31G        6.8G        243M        1.5G         24G         22G
Swap:          8.0G        3.0G        5.0G

Выхлоп процессов потреблению свопа:

[me ~]$ for file in /proc/*/status ; do awk '/VmSwap|Name/{printf $2 " " $3}END{ print ""}' $file; done | sort -k 2 -n -r | head -5
mysqld 2976632 kB
tuned 10556 kB
polkitd 5100 kB
VGAuthService 1588 kB
NetworkManager 1384 kB
параметры ядра по памяти:
sudo sysctl -a | grep -i vm
vm.admin_reserve_kbytes = 8192
vm.block_dump = 0
vm.dirty_background_bytes = 0
vm.dirty_background_ratio = 10
vm.dirty_bytes = 0
vm.dirty_expire_centisecs = 3000
vm.dirty_ratio = 30
vm.dirty_writeback_centisecs = 500
vm.drop_caches = 0
vm.extfrag_threshold = 500
vm.hugepages_treat_as_movable = 0
vm.hugetlb_shm_group = 0
vm.laptop_mode = 0
vm.legacy_va_layout = 0
vm.lowmem_reserve_ratio = 256   256     32
vm.max_map_count = 65530
vm.memory_failure_early_kill = 0
vm.memory_failure_recovery = 1
vm.min_free_kbytes = 67584
vm.min_slab_ratio = 5
vm.min_unmapped_ratio = 1
vm.mmap_min_addr = 4096
vm.mmap_rnd_bits = 28
vm.mmap_rnd_compat_bits = 8
vm.nr_hugepages = 0
vm.nr_hugepages_mempolicy = 0
vm.nr_overcommit_hugepages = 0
vm.nr_pdflush_threads = 0
vm.numa_zonelist_order = default
vm.oom_dump_tasks = 1
vm.oom_kill_allocating_task = 0
vm.overcommit_kbytes = 0
vm.overcommit_memory = 0
vm.overcommit_ratio = 50
vm.page-cluster = 3
vm.panic_on_oom = 0
vm.percpu_pagelist_fraction = 0
vm.stat_interval = 1
vm.swappiness = 30
vm.user_reserve_kbytes = 131072
vm.vfs_cache_pressure = 100
vm.zone_reclaim_mode = 0
my.cnf
[me ~]$ grep -vE "^$|^#"  /data/mysql/my.cnf 
[mysqld]
server-id = 14116
log-bin = hostname-bin
log-error=/data/mysql/hostname
basedir=/usr
datadir = /data/mysql
tmpdir  = /data/mysql/tmp/
innodb_data_home_dir = /data/mysql/
socket = /data/mysql/mysql.sock
sql_mode=NO_ENGINE_SUBSTITUTION
explicit_defaults_for_timestamp = 1
query_cache_type = 0
thread_cache_size = 500
tmp_table_size = 5G
delayed_queue_size = 200
net_buffer_length = 32K
read_rnd_buffer_size = 64M
bulk_insert_buffer_size = 512M
join_buffer_size = 512M
read_buffer_size = 512M
sort_buffer_size = 512M
innodb_buffer_pool_size=25G
innodb_data_file_path = ibdata1:12M:autoextend
innodb_file_per_table = 1
innodb_log_files_in_group = 2
innodb_log_file_size = 4G
innodb_flush_log_at_trx_commit = 2
innodb_log_buffer_size = 512M
innodb_flush_method = O_DIRECT
innodb_thread_concurrency = 48
innodb_strict_mode=off
max_connections = 2400
expire_logs_days = 3
max_allowed_packet = 1024M
max_error_count = 64
max_heap_table_size = 1024M
open_files_limit = 4096
long_query_time = 30
wait_timeout = 1800
max-binlog-size = 1024M
range_optimizer_max_mem_size = 0
binlog-format = mixed
slave_parallel_workers=40
slave_parallel_type = LOGICAL_CLOCK
net_read_timeout=120
net_write_timeout=180
[me~]$ iostat 
Linux 3.10.0-957.el7.x86_64 (hostname)       01/13/2020      _x86_64_        (4 CPU)
avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.96    0.05    0.32    0.18    0.00   98.49
Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
sda              10.23         1.07       474.06    9583704 4236848304
dm-0              0.10         0.01         0.39      73093    3495820
dm-1              0.13         0.08         0.43     751960    3840532
dm-2              0.04         0.54         0.02    4802280     200592
dm-3             22.66         0.38       469.33    3363537 4194622224
dm-4              0.96         0.06         3.88     562013   34689060

Подозреваю, что еще нужен выхлоп переменных рантайма, но там их очень уж дофига.

Если есть толковые DBA - помогите, пожалста, ничего в голову не приходит.

★★★★

Ответ на: комментарий от Deleted

Да, я всерьёз считаю, что эмуляция оперативки через жёсткий диск — это устаревшая технология. В современном мире можно просто купить ещё одну планку памяти.

mabu
()
Ответ на: комментарий от mabu

Да, я всерьёз считаю, что эмуляция оперативки через жёсткий диск

Почитай матчасть прежде чем озвучивать свои странный поток сознания, имеющий мало общего с реальностью. Это не эмуляция оперативки.

Deleted
()
Ответ на: комментарий от mabu

Вы серьёзно считаете, что программа упадёт потому, что подкачка страниц отключена?

Да. Недавно столкнулся с тем что у меня падают в случайное время сборки в jenkins (да и сам jenkins иногда).

Случилось это после того как я отключил swap. Отключил я его из-за того, что несмотря на практически свободную RAM (> 50GB), система при сборке отжирала пару гигабайтов swap (c vm.swappiness все нормально).

Включил zram - проблема пропала.

И если упадёт, то по какой причине?

Я так и не понял почему оно падало.

Tanger ★★★★★
()
Ответ на: комментарий от mabu

Расскажи успешный куда воткнуть ещё одну плашку когда слоты для памяти заняты.

anonymous
()
Ответ на: комментарий от Deleted

Почитай матчасть

Здрасьте, приплыли. Подкачка страниц была введена чтобы можно было выгружать на диск неиспользуемые процессы и загружать в память нужные процессы. Это было сделано потому, что два или более процесса не могли уместиться в памяти, её не хватало. В наше время когда оперативка стоит дёшево, в память можно загрузить сразу все программы и не выгружать их на диск.

mabu
()
Ответ на: комментарий от Deleted

Swap порой нужен, но можешь его размещать в памяти.

  1. Нужен для чего?

  2. Перебрасывать в память страницы, которые в данный момент сидят в памяти? Переливаем из пустого в порожнее?

mabu
()
Ответ на: комментарий от mabu

Другого линукса у меня для вас нет.

Deleted
()
Ответ на: комментарий от mabu

.. поскольку анонимные страницы по своей природе не имеют резервного хранилища, к которому можно обратиться при удалении данных из памяти, — таким образом, их высвобождение приведёт к полной утере данных из соответствующих страниц. Однако… что будет, если мы смогли бы создать такое хранилище для этих страниц?
Вот именно для этого и существует swap. Swap — область хранения для этих, кажущихся «невысвобождаемыми» [unreclaimable], страниц, позволяющая отправлять их на устройство хранения по запросу. Это означает, что их можно начинать считать такими же доступными для высвобождения, как и их более простые в этом смысле друзья (вроде чистых файловых страниц), что позволяет эффективнее использовать свободную физическую память.
Swap — это преимущественно механизм для равного высвобождения, а не для срочной «дополнительной памяти». Не swap замедляет работу вашего приложения — замедление происходит из-за начала совокупной конкуренции за память.

Deleted
()
Последнее исправление: Deleted (всего исправлений: 1)
Ответ на: комментарий от Deleted

Извините, но не убедили: ваша стройная гипотеза рушится о бездисковые системы, где все данные вместе с программами хранятся и работают в оперативке, и страницы перемещать некуда.

mabu
()
Ответ на: комментарий от Deleted

Лучше читать оригинал. Перевод не сказать, что плохой, но переводчик несколько вольновато обращается с переводом конкретных технических терминов, что может вызывать недопонимание читателем.

gremlin_the_red ★★★★★
()
Ответ на: комментарий от mabu

Когда может потребоваться освободить неиспользумые страницы? Когда программа выделяет кусок памяти больше, чем свободная память. Или когда эвристика в ядре решает (а она умная, будь, как эвристика), что дисковый кэш сейчас важнее этих неиспользуемых страниц. Очевидно, что в случае бездисковых систем нет ситуации нехватки дискового кэша, и во втором случае никто никуда данные перемещать не хочет. Хотя, для решения первой проблемы, и тут свап в виде ZRAM весьма полезен.

gremlin_the_red ★★★★★
()
Ответ на: комментарий от mabu

Рассуждения об отключении свопа отчаянно напоминают мне рассуждения о ремнях безопасности. Примерно те же аргументы «я всё контролирую», «у меня иконки» и «тут каждый сам для себя решает» и т.д. :)

Deleted
()
Ответ на: комментарий от mabu

В современном мире можно просто купить ещё одну планку памяти.

1. Если свободных слотов нэма это звучит во множественном числе.
2. Регистровая под какой-нидь старый сервак и сейчас стоит не дешево
3. Не всегда, например привет от яблочной продукции (я говорю не только про распаянную)

anc ★★★★★
()
Ответ на: комментарий от Deleted

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

anonymous
()
Ответ на: комментарий от mabu

Hibernate в linux реализован через swap. Все mmap файлы (и бинарники в том числе) — это тоже swap по сути (они могут выгружаться из памяти и зачитываться с диска снова)

anonymous
()

размер базы маленький - 30 Гб

из них ~20+Гб система держит в дисковом кеше. доступ к базе ускоряется. что тебе не нравится?

anto215 ★★
()
Ответ на: комментарий от anonymous

Выгрузка базы в swap = умер для клиентов

Мониторинг и тюнинг базы не?

К тебе прибежало +100 человек внезапно, а без свопа база сразу же тупо отстрелилась OOM и данные в БД ушли по бороде, отлично! Я поэтому и говорю про аналогию с ремнями безопасности.

Deleted
()
Ответ на: комментарий от Deleted

тюнинг базы не?

Конечно.

а без свопа база сразу же тупо отстрелилась OOM

Для этого и нужна настройка параметров базы.

Я поэтому и говорю про аналогию с ремнями безопасности.

Аналогия с ремнями — ошибочна, я выше объяснил почему.

anonymous
()
Ответ на: комментарий от anonymous

Для этого и нужна настройка параметров базы.

Правильно. Но, вам выше Dimez все верно написал.

отстрелилась OOM и данные в БД ушли по бороде

Видите разницу между «стала тупить и поэтому нам надо тюнить» и «возможно мы пролюбили данные»?

anc ★★★★★
()
Ответ на: комментарий от mabu

Своп нужен, как спасательній круг. Хотя на новіх серваках мі вікидіваем, благо ресурсі позволяют.

Накидалось задач сейчас на работе, попробую завтра-послезавтра поиграться с настройками и расскажу, чем закончилось.

PunkoIvan ★★★★
() автор топика
Ответ на: комментарий от PunkoIvan

Своп нужен, как спасательній круг

Нет, он нужен совсем для другого. И он нужен всегда и везде.

gremlin_the_red ★★★★★
()
Ответ на: комментарий от Deleted

Не. Сейчас на подоптіном серваке включили log-updates-slave и смотрим на динамику. Вся свободная рама перешла -> cached и начало свапиться. Ждем еще немного и начинаем менять параметрі мускуля. В первую очередь хочется урезать innodb_pool_size.

PunkoIvan ★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.