Erlang: несоответствие показателей использования памяти - PullRequest
1 голос
/ 28 июля 2011

Когда я запустил свой тест WebSocket, я нашел следующие интересные результаты использования памяти:

Сервер указан, соединение отсутствует

[{total,573263528},
 {processes,17375688},
 {processes_used,17360240},
 {system,555887840},
 {atom,472297},
 {atom_used,451576},
 {binary,28944},
 {code,3774097},
 {ets,271016}]
44 processes,
System:705M, 
Erlang Residence:519M

100K подключений

[{total,762564512},
 {processes,130105104},
 {processes_used,130089656},
 {system,632459408},
 {atom,476337},
 {atom_used,456484},
 {binary,50160},
 {code,3925064},
 {ets,7589160}]
100044 processes,
System: 1814M, 
Erlang Residence: 950M

200K подключений

(перезапустить сервер и создать соединение из 0, не продолжать со случая 2)

[{total,952040232},
 {processes,243161192},
 {processes_used,243139984},
 {system,708879040},
 {atom,476337},
 {atom_used,456484},
 {binary,70856},
 {code,3925064},
 {ets,14904760}]
200044 processes,
System:3383M, 
Erlang: 1837M

Цифры с "System:" и "Erlang:" предоставляются htop, другие выводят вызов memory () из оболочки erlang. Пожалуйста, посмотрите на общую и эрланговую память места жительства. Когда нет соединения, эти два примерно одинаковы, с соединениями 100 КБ, резидентная память немного больше, чем общая, с 200 К соединениями, резидентная память почти вдвое больше общего.

Кто-нибудь может объяснить?

1 Ответ

5 голосов
/ 18 августа 2014

Наиболее вероятный ответ на ваш вопрос - фрагментация памяти.

Выделение памяти ОС стоит дорого, поэтому Erlang пытается управлять памятью за вас. Когда Эрланг выделяет память, он создает сущность, называемую «носитель», которая состоит из множества «блоков». Erlang memory (total) сообщает сумму всех размеров блоков (фактически используемая память). ОС сообщает сумму всех размеров носителей (сумма используемой и предварительно выделенной памяти). Как сумма размеров блоков, так и размеров несущих могут быть прочитаны из Erlang VM. Если (размеры блоков) / (размеры несущих) << 1, то VM испытывает трудности с освобождением несущих. Там может быть много крупных перевозчиков с использованием только нескольких блоков. Вы можете прочитать его с помощью: erlang: system_info ({allocator, Type}). но есть более простой способ. Вы можете проверить это с помощью библиотеки Recon: </p>

http://ferd.github.io/recon/recon_alloc.html

Первая проверка:

recon_alloc:fragmentation(current).

и далее:

recon_alloc:fragmentation(max).

Это должно объяснить разницу между общим объемом памяти, сообщаемым Erlang VM и ОС. Если вы отправляете много небольших сообщений через веб-сокеты, вы можете уменьшить фрагментацию, запустив Erlang с двумя опциями:

erl +MBas aobf +MBlmbcs 512

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...