UNIX SCO 5.0.5 是否有tcp端口侦听个数限制?
请问一下,UNIX是否有tcp端口侦听数的限制?如果有,上限是多少?如何改大?
问题是这样:我们程序打开了40多个tcp端口侦听的时候没有问题,但增加到90多个tcp侦听的时候出了问题。现在怀疑有可能是UNIX有tcp端口侦听个数的限制,从而造成了问题。当然,也有可能是我们程序其它地方出现了问题。
所以,请哪位清楚的大虾指点一下!多谢了!
问题点数:50、回复次数:36Top
1 楼fierygnu(va_list)回复于 2006-03-08 09:58:50 得分 0
出问题是什么现象?哪个函数返回错误?errno是多少?。。。Top
2 楼universes(及时揭帖是一种美德 | CSDN也这么黑)回复于 2006-03-08 10:45:14 得分 0
fierygnu(va_list) :
Thanks!
不好意思,这个我也不清楚。
因为是客户那边使用我们的程序出了问题,由我们的技术支持反映过来的。
我刚刚测试了一下,打开了120多个端口,也没什么问题。
只是现在的测试还没有使用这些端口,所以也还不确定如果有这么多个连接会不会出现问题。Top
3 楼universes(及时揭帖是一种美德 | CSDN也这么黑)回复于 2006-03-08 11:06:22 得分 0
刚刚测试了一下,好像在8000多的端口打开都没问题,50000以上的端口就都打不开:(Top
4 楼fierygnu(va_list)回复于 2006-03-08 14:43:17 得分 0
socket数目有限制是肯定的,端口数就不清楚了。检查一下代码吧。Top
5 楼universes(及时揭帖是一种美德 | CSDN也这么黑)回复于 2006-03-09 14:52:22 得分 0
多谢fierygnu(va_list) !
socket数目有限制肯定会出现一点问题,但现在技术支持反映过来的是:
在同样数目的连接下,如果采用端口复用,只侦听少量端口,就不会有问题;而如果每个连接数都打开一个端口就会有问题。
这样似乎和socket的连接数目没有关系,而和打开的侦听端口的个数有关系。
困惑ing。。。。
自己也正在网上查资料,找到答案了也会来报一下的。如果哪位大虾知道这是什么问题,也请不吝赐教!多谢!Top
6 楼universes(及时揭帖是一种美德 | CSDN也这么黑)回复于 2006-03-09 14:59:50 得分 0
网上找到一篇文章,讲的是在windows2000下侦听端口的限制为64个,不知道在unix和linux上是否也有这样的限制?各是多少?
另外还有一个困惑,如果真有打开端口或socket连接数的的限制,那么系统本身就侦听了很多端口或有很多socket连接,是否会减少其它应用程序的打开端口数或socket连接数?
这些限制是由inetd来统一管理的吗?
找到的文章如下:
windows2000下select()同时监听的Socket数目是不是限制为64了?
hnhawk () 2003-12-05 10:46:10 在 .NET技术 / VC.NET 提问
例如:
使用windows2000下select()同时监听65个Socket,当所有端口均活动时,怎么只能感知到64个,最后一个不能感知,怎么回事?
问题点数:0、回复次数:1
1楼 poweruser (Loading......) 回复于 2003-12-05 10:58:00 得分 0
默认是64,可以自己修改
The variable FD_SETSIZE determines the maximum number of descriptors in a set. (The default value of FD_SETSIZE is 64, which can be modified by defining FD_SETSIZE to another value before including Winsock2.h.)Top
7 楼fierygnu(va_list)回复于 2006-03-09 15:00:09 得分 0
出问题时用trace跟踪一下看看是什么地方的问题。Top
8 楼universes(及时揭帖是一种美德 | CSDN也这么黑)回复于 2006-03-22 10:09:28 得分 0
终于找到问题所在了.
配置了90路的时候还没有问题,配置了91路的时候就打出了下面这些内容:
inetd: resource /etc/auth/system/authorize could not be allocated due
to: can not open
inetd: resource: System Defualts database could not be allocated due
to: can not be read
而且,此时普通的telnet连接上去也会打出这句话,也登陆不上,而且连一路也登陆不上.
另外,前面提到的50000就打不开其实是假象,而是由于上面所提到的这个原因造成的.
我自己也到网上查查哪里会打出这些错误内容,也请了解这个问题的大虾相助!多谢了!Top
9 楼universes(及时揭帖是一种美德 | CSDN也这么黑)回复于 2006-03-22 11:15:38 得分 0
郁闷,用的是正版SCO,但是去提问的时候他说要购买他的服务他才肯回答,2000一年,最多问20个问题....
哎,俺们公司什么时候也这样收费,那就赚翻了......Top
10 楼fierygnu(va_list)回复于 2006-03-22 11:18:04 得分 0
sco就是死狗 :)
看看文件系统空间。用strace跟踪一下出问题时的应用。Top
11 楼alaiyeshi(七宝树八宝饭)回复于 2006-03-22 12:08:13 得分 0
这么黑???
看来卖服务是真牛,不过我奇怪,弄的客户不喜欢用了,它还怎么赚钱?Top
12 楼universes(及时揭帖是一种美德 | CSDN也这么黑)回复于 2006-03-22 12:47:23 得分 0
不好意思,不知道如何使用strace :(
自己找找先找找资料,大虾可以推荐一下吗?谢了!Top
13 楼fierygnu(va_list)回复于 2006-03-22 12:50:30 得分 0
笔误了,sco上是trace。man trace就可以了。Top
14 楼universes(及时揭帖是一种美德 | CSDN也这么黑)回复于 2006-03-22 12:51:55 得分 0
SCO不行了,现在临死前还想打击一把Linux.....Top
15 楼universes(及时揭帖是一种美德 | CSDN也这么黑)回复于 2006-03-22 13:03:13 得分 0
对了,trace只是调试程序吧?
现在的问题是打开了多个端口以后,连普通的telnet上去都马上直接退下来了.我们的程序和telnet退出时的现象是一样的.而且我们程序在你连接上时还会写日志,但是现在日志里根本就没写任何东西.所以,trace应该是起不了作用啊....
用netstat命令查看,那些端口都侦听了,包括23telnet端口.可就是奇怪,一个连接不上去,然后打出了上面的错误提示...Top
16 楼fierygnu(va_list)回复于 2006-03-22 13:08:34 得分 0
用trace跟踪你的应用看看为什么退出。Top
17 楼universes(及时揭帖是一种美德 | CSDN也这么黑)回复于 2006-03-22 13:18:10 得分 0
这个错误是inetd打出来的,而且现在我用其他手段(在程序的开始处打印信息,写日志),可以确认根本就没有调用我的程序就直接退出了.也就是说问题出在inetd里,还没到调用我的程序的这一步就over了Top
18 楼fierygnu(va_list)回复于 2006-03-22 13:21:06 得分 0
那就trace -p <inetd.pid>Top
19 楼universes(及时揭帖是一种美德 | CSDN也这么黑)回复于 2006-03-22 13:54:48 得分 0
trace -p 3593 /etc/inetd 得到的结果是:
_sighold (18) = 0
_sighold (1) = 0
_sighold (14) = 0
_fork() = 0
_sigrelse (18) = 0
_sigrelse (1) = 0
_sigrelse (14) = 0
_close (3) = 0
其中 3593是 inetd的进程号Top
20 楼universes(及时揭帖是一种美德 | CSDN也这么黑)回复于 2006-03-22 13:59:07 得分 0
正常情况下打印出来的为:
_sighold (18) = 0
_sighold (1) = 0
_sighold (14) = 0
_fork() = 3929
_sigrelse (18) = 0
_sigrelse (1) = 0
_sigrelse (14) = 0
_close (3) = 0
看了是不是inetd没有fork出子进程?why?Top
21 楼fierygnu(va_list)回复于 2006-03-22 14:05:44 得分 0
用trace -f -p 。。。,看看fork的执行情况。
Top
22 楼universes(及时揭帖是一种美德 | CSDN也这么黑)回复于 2006-03-22 14:11:18 得分 0
加了-f child
发现打开/etc/auth/system/gr_id_map
和/etc/gruop文件后都返回了-1,而且can't find errnoTop
23 楼universes(及时揭帖是一种美德 | CSDN也这么黑)回复于 2006-03-22 14:15:33 得分 0
详细信息如下:
# trace -p 7159 -f child /etc/inetd
Process 7159 attached - interrupt to quit
(7159) _sighold (18) = 0
(7159) _sighold (1) = 0
(7159) _sighold (14) = 0
(7191) -- trace started --
(7159) _fork () = 7191
(7159) -- released --
(7191) _fork () = 0
(7191) _sigrelse (18) = 0
(7191) _sigrelse (1) = 0
(7191) _sigrelse (14) = 0
(7191) _open ("/etc/default/login", 0x0) = -1 (can't find errno)
(7191) _getegid () = 3
(7191) __xstat () = 0
(7191) _xstat (51, 0x8008cdd8, 134511924) = 0
(7191) __stat32 ("/etc/group", 0x8047d34) = 0
(7191) __xstat () = 0
(7191) _xstat (51, 0x8008cde4, 134511808) = 0
(7191) __stat32 ("/etc/auth/system/gr_id_map", 0x8047cc0) = 0
(7191) _open ("/etc/auth/system/gr_id_map", 0x0) = -1 (can't find errno)
(7191) _open ("/etc/group", 0x0) = -1 (can't find errno)
(7191) _geteuid () = 0
(7191) __xstat () = -1 (can't find errno)
(7191) _xstat (51, 0x805d420, 134511016) = -1 (can't find errno)
(7191) __stat32 ("/etc/passwd-t", 0x80479a8) = -1 (can't find errno)
(7191) _open ("/etc/passwd", 0x0) = -1 (can't find errno)
(7191) __xstat () = -1 (can't find errno)
(7191) _xstat (51, 0x805d434, 134511016) = -1 (can't find errno)
(7191) __stat32 ("/etc/shadow-t", 0x80479a8) = -1 (can't find errno)
(7191) _open ("/etc/shadow", 0x0) = -1 (can't find errno)
(7191) _eaccess ("/etc/shadow", 0x0) = 0
(7191) __xstat () = 0
(7191) _xstat (51, 0x805de68, 134511152) = 0
(7191) __stat32 ("/etc/auth/system/default", 0x8047a30) = 0
(7191) __xstat () = 0
(7191) _xstat (51, 0x8008c48c, 134511152) = 0
(7191) __stat32 ("/etc/default/login", 0x8047a30) = 0
(7191) __xstat () = 0
(7191) _xstat (51, 0x8008c4a0, 134511152) = 0
(7191) __stat32 ("/etc/default/passwd", 0x8047a30) = 0
(7191) __xstat () = -1 (can't find errno)
(7191) _xstat (51, 0x8055b2c, 134510840) = -1 (can't find errno)
(7191) __stat32 ("/etc/auth/system/default-t", 0x80478f8) = -1 (can't find errno)
(7191) _open ("/etc/auth/system/default", 0x0) = -1 (can't find errno)
(7191) __xstat () = -1 (can't find errno)
(7191) _xstat (51, 0x8055b2c, 134510408) = -1 (can't find errno)
(7191) __stat32 ("/etc/auth/system/default-t", 0x8047748) = -1 (can't find errno)
(7191) _open ("/etc/auth/system/default", 0x0) = -1 (can't find errno)
(7191) _open ("/etc/default/security", 0x0) = -1 (can't find errno)
(7191) _write (2, "inetd: ", 7) = 7
(7191) _write (2, "resource: System Defaults database could".., 80) = 80
(7191) _write (2, "\n", 1) = 1
(7191) __xstat () = 0
(7191) _xstat (51, 0x8008cdd8, 134510936) = 0
(7191) __stat32 ("/etc/group", 0x8047958) = 0
(7191) __xstat () = 0
(7191) _xstat (51, 0x8008cde4, 134510820) = 0
(7191) __stat32 ("/etc/auth/system/gr_id_map", 0x80478e4) = 0
(7191) _open ("/etc/auth/system/gr_id_map", 0x0) = -1 (can't find errno)
(7191) _open ("/etc/group", 0x0) = -1 (can't find errno)
(7191) time (0x0) = 1143007009
(7191) _time (0x0) = 1143007009
(7192) -- trace started --
(7191) _fork () = 7192
(7191) -- released --
(7192) _fork () = 0
(7192) _open ("/tcb/files/subsys/none", 0x0) = -1 (can't find errno)
(7192) _execve ("/etc/auth/dlvr_audit", 0x8047a4c, 0x8047ee4)
(7192) >>> starting /etc/auth/dlvr_audit <<<
(7192) _exit (1) = ?Top
24 楼fierygnu(va_list)回复于 2006-03-22 14:39:23 得分 50
文件描述符超限了?ulimit -n是多少?或者看看/etc/conf/cf.d/stune?Top
25 楼universes(及时揭帖是一种美德 | CSDN也这么黑)回复于 2006-03-22 14:42:22 得分 0
vi /etc/conf/cf.d/stune 如下:
NODE "scosysv"
NSPTTYS 743
EVQUEUES 751
EVDEVS 759
NUMSP 256
NSTREAM 4096
NHINODE 1024
TTHOG 4096
NCLIST 512
NSTREVENT 8192
NUMTIM 1040
NUMTRW 1040
SECLUID 0
SECSTOPIO 1
SECCLEARID 1
NOFILES 120Top
26 楼fierygnu(va_list)回复于 2006-03-22 14:54:11 得分 0
NOFILES 120
看看inetd打开了多少描述符,是不是超了120个。linux可以用lsof或者直接到/proc去看,sco我就不清楚了。Top
27 楼universes(及时揭帖是一种美德 | CSDN也这么黑)回复于 2006-03-22 15:38:24 得分 0
不好意思,刚刚有点其他事情
我将这个值改到了256,然后再测试,还是有问题。。。。Top
28 楼fierygnu(va_list)回复于 2006-03-22 15:44:38 得分 0
重新连接、重启了吗?
cd /etc/conf/cf.d
./link_unix
rebootTop
29 楼universes(及时揭帖是一种美德 | CSDN也这么黑)回复于 2006-03-22 16:48:31 得分 0
可以了!
谢谢大虾!
但不知道这是什么道理,大虾可以说明一下,或者给个资料吗?
多谢了!Top
30 楼fierygnu(va_list)回复于 2006-03-22 16:56:12 得分 0
inetd使用的文件描述符超限了,所以不能打开新的文件,导致错误。Top
31 楼universes(及时揭帖是一种美德 | CSDN也这么黑)回复于 2006-03-22 17:11:26 得分 0
大虾加我qq一下好吗?:45335240
或者msn:hmilyajiao@hotmail.com
我对这里提到的文件描述符不是很清楚:侦听的端口需要打开一些文件描述符,那么,当有连接上来是不是又要打开另外一些文件描述符?这些侦听的端口的描述符和已连接的描述符是不是加起来不能超过NOFILES?
在qq再向你请教吧!多谢领了!Top
32 楼fierygnu(va_list)回复于 2006-03-22 18:17:12 得分 0
我无QQ :(
你的理解是对的。
Top
33 楼universes(及时揭帖是一种美德 | CSDN也这么黑)回复于 2006-03-23 08:28:41 得分 0
呵呵,自己再想了一下,有如下理解:
因为inetd始终是一个进程,它打开的文件描述符最多也就是NOFILES.而它调用telnet或者我们的程序的时候,是fork出来了子进程,子进程打开的文件描述符的个数就不会算到父进程的个数里面了.所以,我们的程序有超过NOFILES个连接存在的时候是没有问题的,因为这些文件描述符(socket)是由不同的进程打开的.而侦听端口超过NOFILES个就不行了,因为这些文件描述符都是由inetd进程打开的.
也就是说,文件描述符的限制是一个进程打开的文件描述符的个数.
这样的理解应该对了吧?
知道拖了这么久没有揭帖不好,但是还希望大虾给一个肯定的回复"是",如果理解不对请指正,多谢了!Top
34 楼fierygnu(va_list)回复于 2006-03-23 09:06:36 得分 0
是。NOFILES是每个进程可以打开的描述符限制。Top
35 楼universes(及时揭帖是一种美德 | CSDN也这么黑)回复于 2006-03-23 09:12:10 得分 0
多谢大虾!Top
36 楼fierygnu(va_list)回复于 2006-03-23 09:18:56 得分 0
不客气。希望你能从中获取一些解决问题的思路和方法:)Top




