Кажется решил проблему. В этом мне помогла ссылка
http://www.smira.ru/2008/02/09/python-memory-leak-resolved/ где такая же причина утечки. Клиент не успевает забирать данные и они копятся в каком-то буфере. Сам буфер я не нашел, поэтому пришлось писать напрямую в сокет:
def datagramReceived(self, data, address):
# получаем пакет и посылаем его по всем затребовавшим
for out in outputs:
out.transport.socket.send(self.data)
#out.write(data)
В таком виде память не съедается. Причина непосредственно утечки, как мне кажется, кроется в методе writeSomeData класса Connection из internet.tcp. Код выглядит так:
def writeSomeData(self, data):
"""Connection.writeSomeData(data) -> #of bytes written | CONNECTION_LOST
This writes as much data as possible to the socket and returns either
the number of bytes read (which is positive) or a connection error code
(which is negative)
"""
try:
# Limit length of buffer to try to send, because some OSes are too
# stupid to do so themselves (ahem windows)
return self.socket.send(buffer(data, 0, self.SEND_LIMIT))
except socket.error, se:
if se.args[0] == EINTR:
return self.writeSomeData(data)
elif se.args[0] in (EWOULDBLOCK, ENOBUFS):
return 0
else:
return main.CONNECTION_LOST
Если я все правильно понял, то если в данный момент в буфере сокета уже есть неотправленные данные, то socket.send генерирует исключение, в одном из которых эта функция рекурсивно вызывается снова. То есть если появится клиент с низкой скоростью, то быстро наплодится очень много вызовов этой функции. Не знаю, прав я или нет, но других причин найти не смог.