Найти - Пользователи
Полная версия: Проблема socket при маленьких пакетах
Начало » Network » Проблема socket при маленьких пакетах
1
o7412369815963
Простой клиент/сервер, если я пересылаю сообщения размером менее 1150 байт, то эта связка рушится (после 40к-60к коннектов):
Клиент не коннектится и выдает " Cannot assign requested address“
Сервер молча висит, но если его пытаться перезапустить то ”socket.error: Address already in use", хотя netstat -nlp кажет что порт свободен.
Спустя минуту порт освобождается и можно запускать заново.

Но если я отправляю сообщения 1150 байт и более, то все работает стабильно.
ubuntu 11.10 64bit, py2.7

подозрение на linux, никто не сталкивался с таким?

server
import socket
import time
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('', 11000))
s.listen(10)
def work():
    try:
        conn, addr = s.accept()
        data = conn.recv(16384)
        conn.sendall(data)
    finally:
        conn.close()
try:
    t = time.time()
    col = 0
    while 1:
        col += 1
        if not col%10000:
            t0 = time.time()
            d = t0 - t
            print '%d: %.2fs, b: %.2f' % (col, d, 10000/d)
            t = t0
        work()
finally:
    print 'close socket'
    s.close()

client
import socket
import time
def work():
    try:
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.connect(('localhost', 11000))
        #s.sendall('0123456789'*115) # <--- no errors
        s.sendall('0123456789'*10) # errors
        data = s.recv(16384)
    except Exception as e:
        print e
        time.sleep(1)
    finally:
        s.close()
col = 0
while 1:
    col += 1
    if not col%10000: print col
    work()
reclosedev
o7412369815963
Клиент не коннектится и выдает “ Cannot assign requested address“Сервер молча висит, но если его пытаться перезапустить то ”socket.error: Address already in use”, хотя netstat -nlp кажет что порт свободен.
От этого спасет
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

А насчет буфера, на win тоже ошибка в клиенте на стадии подключения, но с REUSEADDR через несколько секунд опять подключается. В сервере ошибок не возникает.

Тоже интересно, что тут не так.

upd
Похоже, дело в том, что close не успевает так быстро закрывать сокеты. Если добавить в сервер
    finally:
        conn.shutdown(socket.SHUT_RDWR)
        conn.close()
и REUSEADDR, все работает.
o7412369815963
Если клиента подольше подержать - он “очухивается”
[Errno 99] Cannot assign requested address
[Errno 99] Cannot assign requested address
[Errno 99] Cannot assign requested address
70000
80000
[Errno 99] Cannot assign requested address
....
[Errno 99] Cannot assign requested address
90000
100000
110000
[Errno 99] Cannot assign requested address

Выяснил что это происходит при любом размере пакета.

Ещё проверил на сервере, там стабильно работает, но если запустить параллельно ещё 2 клиента, то они тоже валятся, но быстро приходят в себя. Т.е. это похоже на то что сервер не справляется и часть коннектов дропает.

но не понятно почему у меня локально (на буке) оно “клинится” на длительное время.
reclosedev
Посмотрите upd в предыдущем посте. Помогло?

Я так понимаю, что дело в превышении лимитов одновременно открытых сокетов, из-за того, что на время пока close() отдает закрытие на откуп системе, сервер уже готов принимать новые соединения, а клиенты пытаются насоздовать новые сокеты.

o7412369815963
Ещё проверил на сервере, там стабильно работает,
Наверное, там лимиты побольше.
o7412369815963
reclosedev
Посмотрите upd в предыдущем посте. Помогло?Я так понимаю, что дело в превышении лимитов одновременно открытых сокетов, из-за того, что на время пока close() отдает закрытие на откуп системе, сервер уже готов принимать новые соединения, а клиенты пытаются насоздовать новые сокеты.
Да, похоже на правду.
Теперь с одним клиентом работает нормально ( с 2-мя и более уходит в клин ).

Спасибо.
o7412369815963
Запустил 4 форка от сервера и 10 клиентов, на core i7 920, обрабатывает 25к коннектов в сек. работает стабильно.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB