Каждое сетевое соединение потребляет определенный объем памяти ядра, чем больше соединений, тем больше памяти нужно и тем ближе момент, когда в списке процессов можно будет увидеть статус zoneli (zonelimit). Но обо всем по порядку.
Для каждого TCP соединения ядро выделяет два буфера, буфер на прием и буфер на отправку данных. Эти значения задаются параметрами net.inet.tcp.sendspace и net.inet.tcp.recvspace. По умолчанию они равны 32 и 64 килобайтам. Т.е. чтобы поддерживать одно соединение нужно 96К памяти ядра. Это конечно не совсем так, так как кроме этих буферов используются и другие ресурсы, с другой стороны не факт, что соединению потребуется буфер целиком. В man tuning для определения потребляемой памяти для TCP соединений придерживаются правила “x2″, т.е. увеличивают вдвое расчетные параметры. Я бы сказал что при значениях буферов 32К и 64К двойной запас прочности излишен, лучше домножить на 1,5.
В результате получаем, что для обслуживания 1000 одновременных соединений требуется
1000 * (64 + 32) * 1,5 = 144000К памяти.
А сколько памяти разрешено ядру выделять под TCP соединения в данный момент? Это определяет параметр ядра kern.ipc.nmbclusters. Для буферов приема и отправки ядро используется mbuf, число которых как раз определяется nmbclusters, каждый кластер занимает 2К, т.е. чтобы определить сколько nmbclusters нужно для обслуживания 1000 TCP соединений, нужно поделить полученный объем необходимой памяти на размер кластера
144000 / 2 = 72000
Т.е. нужно установить kern.ipc.nmbclusters = 72000
Если мы ошиблись и кластеров не хватит, то процесс который их не получит перейдет в состояние zonelimit (в top будет видно zomeli). Чтобы проверить текущее потребление mbuf можно воспользоваться netstat
# netstat -m
…
512/418/930/25600 mbuf clusters in use (current/cache/total/max)
…
15 Октябрь 2009
FreeBSD mbuf и nmbclusters (или сколько нужно памяти вашему серверу)
Нет комментариев
Еще нет комментариев.
RSS лента комментариев к этой записи. TrackBack URL
Извините, комментирование на данный момент закрыто.