Недостаточный объём памяти (RAM)

Если swap (paging of anonymous memory) отключён на сервере YDB, недостаточный объём памяти активирует механизм ядра системы OOM killer, который завершает процессы, потребляющие больше всего оперативной памяти. Часто это сама база данных. Этот механизм также взаимодействует с cgroups, если сконфигурировано несколько cgroups.

Если swap включён, недостаточный объём памяти может приводить к сильной зависимости скорости базы данных от пропускной способности дисковой системы, которая значительно медленнее, чем доступ к данным в памяти.

Важно

Если узлы YDB выполняются на серверах с включённым swap, необходимо отключить swap. YDB – это распределённая система, поэтому если узел перезапускается из-за недостатка памяти, клиент просто переподключится к другому узлу и продолжит работать с данными как будто ничего не случилось. Swap позволяет запросам выполняться на том же узле, но медленнее из-за увеличенной нагрузки на пропускную способность дисковой системы, что обычно ещё хуже.

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

Кроме того, может быть важно, какие компоненты процесса YDB потребляют память.

Диагностика

  1. Определите, не перезапускались ли недавно по неизвестной причине какие-либо узлы YDB. Исключите случаи обновления версии YDB и другого планового обслуживания. Это может помочь обнаружить узлы, которые были завершены из-за нехватки памяти и перезапущены системой systemd.

    1. Откройте встроенный UI.

    2. На вкладке Nodes обратите внимание на узлы с низким значением uptime.

    3. Выберите недавно перезапущенный узел и войдите на сервер, на котором он размещён. Выполните команду dmesg и проверьте, активировался ли недавно механизм OOM killer.

      Ищите подобные строки:

      [ 2203.393223] oom-kill:constraint=CONSTRAINT_NONE,nodemask=(null),cpuset=user.slice,mems_allowed=0,global_oom,task_memcg=/user.slice/user-1000.slice/session-1.scope,task=ydb,pid=1332,uid=1000
      [ 2203.393263] Out of memory: Killed process 1332 (ydb) total-vm:14219904kB, anon-rss:1771156kB, file-rss:0kB, shmem-rss:0kB, UID:1000 pgtables:4736kB oom_score_adj:0
      

    Кроме того, изучите логи ydbd для получения более подробной информации.

  2. Определите, используется ли память на 100%.

    1. Откройте панель мониторинга DB overview в Grafana.

    2. Проанализируйте графики в секции Memory.

  3. Определите, увеличилась ли пользовательская нагрузка на YDB. Проанализируйте следующие графики на панели мониторинга DB overview в Grafana:

    • Requests;
    • Request size;
    • Response size.
  4. Определите, выходили ли новые версии ваших приложений, работающих с YDB, или менялись ли методы доступа к данным в этих приложениях.

Рекомендации

Рассмотрите следующие решения проблемы нехватки памяти:

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

  • Если нагрузка на YDB не изменилась, но узлы всё равно перезапускаются, рассмотрите возможность добавления большего количества узлов YDB или увеличения жёсткого лимита памяти для узлов. Дополнительную информацию об управлении памятью в YDB см. в статье Контроллер памяти.