LINUX.ORG.RU

[Python] xmlrpclib Долгое время запросов

 


0

0

Написал простой XMLRPC сервер и клиент на python. Когда тестирую на localhost - всё работает замечательно. Запросы выполняются мгновенно. Как только перенёс клиент на соседний компьютер, вызов одной процедуры (передаёт 1 инт и принимает 1 инт) длится 5 секунд. С чем это может быть связано?
Код клиента:
self.req = xmlrpclib.ServerProxy("http://192.168.1.3:8091")
ChangeID = self.req.CheckPlayerChanges(self.PlayerID)
Код сервера:
srv = SimpleXMLRPCServer(("localhost", port)) # Starting server
srv.register_function(self.CheckPlayerChanges)
srv.serve_forever()
............

def CheckPlayerChanges(self,PlayerID):
Player = self.CheckPlayerID(PlayerID)
if Player == 0:
return "ERROR"
Data = Player.HaveData
Player.HaveData=0
return Data

Скорее всего с настройкой сети проблема. В принципе можно запустить с strace -tt и посмотреть какие вызовы происходят, думаю 5 секунд будут видны. =)

YesSSS ★★★
()

Исследование всех траблов с производительностью нужно начинать с прогона под профайлером.

anonymous4
()
Ответ на: комментарий от anonymous4

Собственно профайлер показывает большое количество вызовов recv (521) за время работы приложения 80 сек. Суммарное время затраченное на recv 21 секунда.
Сеть - локальная 100 мегабитка через роутер. Пинги ходят нормально 1мс и меньше в обе стороны.
Попробовал разобраться TCPdump'ом, но не совсем понял что именно происходит. Судя по всему с отправкой тормозит сервер, но вот почему после ack ответа идёт 5секундная задержка?
Вывод tcpdump (снимается на стороне сервера gard-laptop.local):
12:27:28.786482 IP 192.168.1.5.xtel > gard-laptop.local.8091: . ack 1 win 65535
12:27:28.795877 IP 192.168.1.5.xtel > gard-laptop.local.8091: P 1:149(148) ack 1 win 65535
12:27:28.795970 IP gard-laptop.local.8091 > 192.168.1.5.xtel: . ack 149 win 6432
12:27:28.796797 IP 192.168.1.5.xtel > gard-laptop.local.8091: P 149:306(157) ack 1 win 65535
12:27:28.796846 IP gard-laptop.local.8091 > 192.168.1.5.xtel: . ack 306 win 7504
12:27:33.831283 IP gard-laptop.local.8091 > 192.168.1.5.xtel: P 1:18(17) ack 306 win 7504
12:27:33.831608 IP gard-laptop.local.8091 > 192.168.1.5.xtel: FP 18:258(240) ack 306 win 7504


gardster
() автор топика
Ответ на: комментарий от gardster

который из хостов твоя тачка? Если gard-laptop.local то тормозит твоя тачка.

true_admin ★★★★★
()
Ответ на: комментарий от hizel

tcpdump в данном случае запустил как: tcpdump -i ath0 | grep 192.168.1.5 Да похоже тормозит моя тачка, но из-за чего вызваны тормоза? Если запустить n копий клиента на локалхосте, то тормозов никаких нет. А один удалённый клиент просто вешает передачу на 5 секунд. Процессор, оператива в норме и их загруженность даже к 20 процентам не приближается.

gardster
() автор топика
Ответ на: комментарий от hizel

tcpdump -i ath0 -np host 192.168.1.5 or port 53
17:06:55.373820 IP 192.168.1.5.7221 > 192.168.1.4.8091: . ack 1 win 65535
17:06:55.383318 IP 192.168.1.5.7221 > 192.168.1.4.8091: P 1:149(148) ack 1 win 65535
17:06:55.390217 IP 192.168.1.4.8091 > 192.168.1.5.7221: . ack 149 win 6432
17:06:55.391045 IP 192.168.1.5.7221 > 192.168.1.4.8091: P 149:306(157) ack 1 win 65535
17:06:55.392273 IP 192.168.1.4.8091 > 192.168.1.5.7221: . ack 306 win 7504
17:06:55.392906 IP 192.168.1.4.57094 > 192.168.1.2.53: 42476+ PTR? 5.1.168.192.in-addr.arpa. (42)
17:06:55.419007 IP 192.168.1.2.53 > 192.168.1.4.57094: 42476 NXDomain* 0/1/0 (101)
17:07:00.423666 IP 192.168.1.4.8091 > 192.168.1.5.7221: P 1:18(17) ack 306 win 7504
17:07:00.423804 IP 192.168.1.4.8091 > 192.168.1.5.7221: FP 18:258(240) ack 306 win 7504
17:07:00.425247 IP 192.168.1.5.7221 > 192.168.1.4.8091: . ack 259 win 65278
17:07:00.428119 IP 192.168.1.5.7221 > 192.168.1.4.8091: F 306:306(0) ack 259 win 65278
17:07:00.428136 IP 192.168.1.4.8091 > 192.168.1.5.7221: . ack 307 win 7504
17:07:01.428730 IP 192.168.1.5.7222 > 192.168.1.4.8091: S 3087537820:3087537820(0) win 65535 <mss 1460,nop,nop,sackOK>
17:07:01.428765 IP 192.168.1.4.8091 > 192.168.1.5.7222: S 1794275647:1794275647(0) ack 3087537821 win 5840 <mss 1460,nop,nop,sackOK>


Действительно, вылезает большое количество DNS запросов. Только мне теперь совсем не понятно зачем используется DNS, если это сервер и, по-сути он должен возвращать результат по уже имеющемуся TCP каналу.

gardster
() автор топика
Ответ на: комментарий от gardster

Всё. Сегодня решил проблему. Всё оказалось довольно просто:
Сервер выводит отладочную информацию в консоль при поступлении каждого запроса. При этом он пытается представить информацию в удобочитаемом виде и для каждого запроса лезет на DNS чтобы узнать имя клиента. DNS естественно на рядового клиента никакое имя не зарегано и сервер получает ответ NXDomain и 5 секунд штрафа.
Такое поведение исправляется запуском сервера с параметром logRequests=False.
P.S. Спасибо всем, кто отписался в этом треде и помог найти причину зависания запросов.

gardster
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.