Andy Melnikov (nponeccop) wrote,
Andy Melnikov
nponeccop

Category:

Новости памятеведения

Как известно, на Линуксе вместо учёта потребления памяти - говно. Ну и народ пытается сделать из этого конфетку. Сегодня, внимательно посмотрев в man top, я там узрел:
                                     Private | Shared
                                 1           |          2
            Anonymous  . stack               |
                       . malloc()            |
                       . brk()/sbrk()        | . POSIX shm*
                       . mmap(PRIVATE, ANON) | . mmap(SHARED, ANON)
                      -----------------------+----------------------
                       . mmap(PRIVATE, fd)   | . mmap(SHARED, fd)
          File-backed  . pgms/shared libs    |
                                 3           |          4
Ну то есть есть какие-то подвижки не только в cgroup. Начиная с ядра 4.7

Тут надо понимать, что один из сценариев зачем нам надо знать про память - это знать, сколько оперативы выделять на сервер. А как это понять из данной картины? Да никак! Только пробовать разные размеры да смотреть когда посыпятся major faults.

Проблема в том, что всегда выделяется больше памяти, чем реально нужно. Это мы даже не рассматриваем сборку мусора, считаем что у нас голый Си. У нас есть более-менее фиксированная и переменная часть.

Более-менее фиксированная это (считаем что sbrk для долбоёбов и в продакшене его нет):

- pgms/shared libs
- stack
- malloc()
. POSIX shm*

Переменная это:

- все варианты mmap
- высвопленные страницы из постоянной части

Теперь представьте что у нас память "заканчивается". Что происходит? Первым в жертву приносится файловый кеш. Затем дискардятся те страницы, которые есть в файловой системе - категория file backed. Ну и пока там дискардятся страницы в memory mapped files, ничего особо страшного не происходит. Жопа начинается тогда, когда в своп уходит "фиксированная часть". А как понять размер при котором она уйдёт в своп, без экспериментов? Опять же никак.

Мы даже не рассматриваем ситуацию, что часть страниц в фиксированной части реально приложением не используются. Вот представьте что все используются. Можно ли как-то получить stack + pgms + malloc + POSIX shm*, добавить к этому рассчётное количество памяти нужное для mmap, и выделить столько физ. памяти?

Получается что теперь таки да - в терминах top это CODE+RSan

Тут кстати ещё интересный момент в плане виртуализации. Если "раньше" пустая физическая память простаивала, и её можно было аллоцировать просто "на всякий случай" - то сейчас это не так. Скажем, если у меня 2-гиговая виртуалка на случай линковки в х-е, но 99.9% я не занимаюсь линковкой в х-е, то выделение этой памяти под дисковый кеш гостя, нуу, несколько расточительно.

Аналогично на VPS - формально то я заплатил и пользуюсь всей памятью, но реально все покупают жирные сервера с оверпровиженом, на которых заполнение этой памяти всякой сранью типа journald mmap бьёт по карману хостера.
Tags: programming, все пидарасы а я, до чего техника дошла
Subscribe

  • Post a new comment

    Error

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 13 comments