У меня есть erlang gen_server, который асинхронно получает сообщения от клиентов (используя приведение). При обработке каждого сообщения сервер вставляет их в упорядоченную таблицу ETS и удаляет некоторые из них в зависимости от условий (из-за условного удаления количество записей в таблице ETS в большинстве случаев составляет около 5000. Но есть редкие сценарии, которые могут увеличить этот размер до 200 КБ, что приводит к накладным расходам как на вставку, так и на удаление).
Это работает нормально до тех пор, пока количество сообщений в секунду не достигнет 100 КБ, но выше этого я получаю верхний водяной знак памяти процесса и начинает потреблять много памяти. Когда я комментирую часть вставки и удаления в упорядоченный ets, он может обрабатывать более 100 тыс. В секунду. Не могли бы вы дать мне несколько советов о том, как решить эту проблему?
Существует ли какой-либо максимальный объем памяти, который может выделять процесс? Я использую 35 ГБ памяти и установил порог водяного знака на memsup:set_procmem_high_watermark(0.6)
. Я также попробовал gbtree и заказал словарь, но они не решили проблему с памятью.