LINUX.ORG.RU

питон виснет при большом кол-ве открытых сокетов


0

0

хай всем
в общем есть софтина - у неё морда на питоне (quixote), сам рабочий код который принимает входящие соединения от клиентских приложений написан на с++ и импортирован (всё сделано через swig и работает прекрасно).

когда начал тестить - обнаружилось что при большом кол-ве входящих соединений тред в котором работает кихот виснет намертво в таком виде:

Thread 1 (Thread -1208387904 (LWP 4383)):
#0 0x00c35402 in __kernel_vsyscall ()
#1 0x0046beb1 in ___newselect_nocancel () from /lib/libc.so.6
#2 0x00112938 in _PyTime_DoubleToTimet ()
from /usr/lib/python2.4/lib-dynload/timemodule.so
#3 0x005ca6c3 in PyCFunction_Call () from /usr/lib/libpython2.4.so.1.0
#4 0x0060331c in PyEval_EvalFrame () from /usr/lib/libpython2.4.so.1.0
#5 0x00603aac in PyEval_EvalFrame () from /usr/lib/libpython2.4.so.1.0
#6 0x00604a1c in PyEval_EvalCodeEx () from /usr/lib/libpython2.4.so.1.0
#7 0x00604b8e in PyEval_EvalCode () from /usr/lib/libpython2.4.so.1.0
#8 0x0062100a in PyErr_Display () from /usr/lib/libpython2.4.so.1.0
#9 0x00622312 in PyRun_SimpleFileExFlags () from /usr/lib/libpython2.4.so.1.0
#10 0x00622d99 in PyRun_AnyFileExFlags () from /usr/lib/libpython2.4.so.1.0
#11 0x00628ef1 in Py_Main () from /usr/lib/libpython2.4.so.1.0
#12 0x080485ba in main ()
(gdb)


ulimit -n unlimited
плюс в sysctl.conf увеличены все параметры:
net.ipv4.ip_forward = 0
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.all.rp_filter = 1
kernel.sysrq = 0
kernel.core_uses_pid = 1
net.ipv4.tcp_fin_timeout = 25
net.ipv4.tcp_keepalive_time = 1200
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_sack = 1
net.ipv4.tcp_fack = 1
net.ipv4.tcp_timestamps = 1
net.ipv4.tcp_syncookies = 1
net.ipv4.ip_local_port_range = 1024 65000
net.ipv4.tcp_reordering = 5
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syn_retries = 3
net.ipv4.tcp_max_syn_backlog = 2048
net.core.netdev_max_backlog = 1024
net.core.hot_list_length = 256
net.ipv4.tcp_max_tw_buckets = 360000
net.core.rmem_default = 65535
net.core.rmem_max = 8388608
net.ipv4.tcp_rmem = 4096 87380 8388608
net.core.wmem_default = 65535
net.core.wmem_max = 8388608
net.ipv4.tcp_wmem = 4096 65535 8388608
net.ipv4.tcp_mem = 8388608 8388608 8388608
net.core.optmem_max = 40960

виснет всё время на этом _PyTime_DoubleToTimet.

думал где то портится память, прогнал valgrindom - всё идеально.

подскажите плиз, запарился уже искать :) спасибо!


btw. большое количество - около 2000 одновременных соединений к c++ модулю.

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

угу, даже гораздо более зверские значения чем у него :) не понятно какого хрена мой код продолжает себе работать без проблем - да и остальной софт на сервере. виснет только этот один тред питоновский в этой функции _PyTime_DoubleToTimet. странно вообще для чего ей select вызывать то.

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

да кстате тестировалось на трёх разных машинах (на всех правда один и тот же ред хет) и результаты одинаковые.

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

вот весь код функции, в упор тут не вижу select-ов. это ещё больше запутывает :(

time_t
_PyTime_DoubleToTimet(double x)
{
	time_t result;
	double diff;

	result = (time_t)x;
	diff = x - (double)result;
	if (diff <= -1.0 || diff >= 1.0) {
		PyErr_SetString(PyExc_ValueError,
		                "timestamp out of range for platform time_t");
		result = (time_t)-1;
	}
	return result;
}

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

ёмаё. только что обнаружил что gdb почему-то всегда прерывает этот тред в одном и том же месте - вне зависимости от того висит он или нет.

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