Ⅰ 求教服务器tcp连接数被占满的有关问题
我问了在约APP的专家,修改上述限制的最简单的办法就是使用ulimit命令:
[speng@as4 ~]$ ulimit -n
上述命令中,在中指定要设置的单一进程允许打开的最大文件数。如果系统回显类似于“Operation notpermitted”之类的话,说明上述限制修改失败,实际上是因为在中指定的数值超过了linux系统对该用户打开文件数的软限制或硬限制。因此,就需要修改Linux系统对用户的关于打开文件数的软限制和硬限制。
第一步,修改/etc/security/limits.conf文件,在文件中添加如下行:
speng soft nofile 10240
speng hard nofile 10240
其中speng指定了要修改哪个用户的打开文件数限制,可用’*'号表示修改所有用户的限制;soft或hard指定要修改软限制还是硬限制;10240则指定了想要修改的新的限制值,即最大打开文件数(请注意软限制值要小于或等于硬限制)。修改完后保存文件。
第二步,修改/etc/pam.d/login文件,在文件中添加如下行:
session required /lib/security/pam_limits.so
这是告诉Linux在用户完成系统登录后,应该调用pam_limits.so模块来设置系统对该用户可使用的各种资源数量的最大限制(包括用户可打开的最大文件数限制),而pam_limits.so模块就会从/etc/security/limits.conf文件中读取配置来设置这些限制值。修改完后保存此文件。
第三步,查看Linux系统级的最大打开文件数限制,使用如下命令:
[speng@as4 ~]$ cat /proc/sys/fs/file-max
12158
这表明这台Linux系统最多允许同时打开(即包含所有用户打开文件数总和)12158个文件,是Linux系统级硬限制,所有用户级的打开文件数限制都不应超过这个数值。通常这个系统级硬限制是Linux系统在启动时根据系统硬件资源状况计算出来的最佳的最大同时打开文件数限制,如果没有特殊需要,不应该修改此限制,除非想为用户级打开文件数限制设置超过此限制的值。修改此硬限制的方法是修改/etc/rc.local脚本,在脚本中添加如下行:
echo 22158 > /proc/sys/fs/file-max
这是让Linux在启动完成后强行将系统级打开文件数硬限制设置为22158。修改完后保存此文件。
完成上述步骤后重启系统,一般情况下就可以将Linux系统对指定用户的单一进程允许同时打开的最大文件数限制设为指定的数值。如果重启后用 ulimit-n命令查看用户可打开文件数限制仍然低于上述步骤中设置的最大值,这可能是因为在用户登录脚本/etc/profile中使用ulimit -n命令已经将用户可同时打开的文件数做了限制。由于通过ulimit-n修改系统对用户可同时打开文件的最大数限制时,新修改的值只能小于或等于上次 ulimit-n设置的值,因此想用此命令增大这个限制值是不可能的。所以,如果有上述问题存在,就只能去打开/etc/profile脚本文件,在文件中查找是否使用了ulimit-n限制了用户可同时打开的最大文件数量,如果找到,则删除这行命令,或者将其设置的值改为合适的值,然后保存文件,用户退出并重新登录系统即可。
通过上述步骤,就为支持高并发TCP连接处理的通讯处理程序解除关于打开文件数量方面的系统限制。
2、修改网络内核对TCP连接的有关限制(参考对比下篇文章“优化内核参数”)
在Linux上编写支持高并发TCP连接的客户端通讯处理程序时,有时会发现尽管已经解除了系统对用户同时打开文件数的限制,但仍会出现并发TCP连接数增加到一定数量时,再也无法成功建立新的TCP连接的现象。出现这种现在的原因有多种。
第一种原因可能是因为Linux网络内核对本地端口号范围有限制。此时,进一步分析为什么无法建立TCP连接,会发现问题出在connect()调用返回失败,查看系统错误提示消息是“Can’t assign requestedaddress”。同时,如果在此时用tcpmp工具监视网络,会发现根本没有TCP连接时客户端发SYN包的网络流量。这些情况说明问题在于本地Linux系统内核中有限制。其实,问题的根本原因在于Linux内核的TCP/IP协议实现模块对系统中所有的客户端TCP连接对应的本地端口号的范围进行了限制(例如,内核限制本地端口号的范围为1024~32768之间)。当系统中某一时刻同时存在太多的TCP客户端连接时,由于每个TCP客户端连接都要占用一个唯一的本地端口号(此端口号在系统的本地端口号范围限制中),如果现有的TCP客户端连接已将所有的本地端口号占满,则此时就无法为新的TCP客户端连接分配一个本地端口号了,因此系统会在这种情况下在connect()调用中返回失败,并将错误提示消息设为“Can’t assignrequested address”。有关这些控制逻辑可以查看Linux内核源代码,以linux2.6内核为例,可以查看tcp_ipv4.c文件中如下函数:
static int tcp_v4_hash_connect(struct sock *sk)
请注意上述函数中对变量sysctl_local_port_range的访问控制。变量sysctl_local_port_range的初始化则是在tcp.c文件中的如下函数中设置:
void __init tcp_init(void)
内核编译时默认设置的本地端口号范围可能太小,因此需要修改此本地端口范围限制。
第一步,修改/etc/sysctl.conf文件,在文件中添加如下行:
net.ipv4.ip_local_port_range = 1024 65000
这表明将系统对本地端口范围限制设置为1024~65000之间。请注意,本地端口范围的最小值必须大于或等于1024;而端口范围的最大值则应小于或等于65535。修改完后保存此文件。
第二步,执行sysctl命令:
[speng@as4 ~]$ sysctl -p
如果系统没有错误提示,就表明新的本地端口范围设置成功。如果按上述端口范围进行设置,则理论上单独一个进程最多可以同时建立60000多个TCP客户端连接。
第二种无法建立TCP连接的原因可能是因为Linux网络内核的IP_TABLE防火墙对最大跟踪的TCP连接数有限制。此时程序会表现为在 connect()调用中阻塞,如同死机,如果用tcpmp工具监视网络,也会发现根本没有TCP连接时客户端发SYN包的网络流量。由于 IP_TABLE防火墙在内核中会对每个TCP连接的状态进行跟踪,跟踪信息将会放在位于内核内存中的conntrackdatabase中,这个数据库的大小有限,当系统中存在过多的TCP连接时,数据库容量不足,IP_TABLE无法为新的TCP连接建立跟踪信息,于是表现为在connect()调用中阻塞。此时就必须修改内核对最大跟踪的TCP连接数的限制,方法同修改内核对本地端口号范围的限制是类似的:
第一步,修改/etc/sysctl.conf文件,在文件中添加如下行:
net.ipv4.ip_conntrack_max = 10240
这表明将系统对最大跟踪的TCP连接数限制设置为10240。请注意,此限制值要尽量小,以节省对内核内存的占用。
第二步,执行sysctl命令:
[speng@as4 ~]$ sysctl -p
如果系统没有错误提示,就表明系统对新的最大跟踪的TCP连接数限制修改成功。如果按上述参数进行设置,则理论上单独一个进程最多可以同时建立10000多个TCP客户端连接。
3、使用支持高并发网络I/O的编程技术
在Linux上编写高并发TCP连接应用程序时,必须使用合适的网络I/O技术和I/O事件分派机制。
可用的I/O技术有同步I/O,非阻塞式同步I/O(也称反应式I/O),以及异步I/O。在高TCP并发的情形下,如果使用同步I/O,这会严重阻塞程序的运转,除非为每个TCP连接的I/O创建一个线程。但是,过多的线程又会因系统对线程的调度造成巨大开销。因此,在高TCP并发的情形下使用同步 I/O是不可取的,这时可以考虑使用非阻塞式同步I/O或异步I/O。非阻塞式同步I/O的技术包括使用select(),poll(),epoll等机制。异步I/O的技术就是使用AIO。
从I/O事件分派机制来看,使用select()是不合适的,因为它所支持的并发连接数有限(通常在1024个以内)。如果考虑性能,poll()也是不合适的,尽管它可以支持的较高的TCP并发数,但是由于其采用“轮询”机制,当并发数较高时,其运行效率相当低,并可能存在I/O事件分派不均,导致部分TCP连接上的I/O出现“饥饿”现象。而如果使用epoll或AIO,则没有上述问题(早期Linux内核的AIO技术实现是通过在内核中为每个 I/O请求创建一个线程来实现的,这种实现机制在高并发TCP连接的情形下使用其实也有严重的性能问题。但在最新的Linux内核中,AIO的实现已经得到改进)。
综上所述,在开发支持高并发TCP连接的Linux应用程序时,应尽量使用epoll或AIO技术来实现并发的TCP连接上的I/O控制,这将为提升程序对高并发TCP连接的支持提供有效的I/O保证。
内核参数sysctl.conf的优化
/etc/sysctl.conf 是用来控制linux网络的配置文件,对于依赖网络的程序(如web服务器和cache服务器)非常重要,RHEL默认提供的最好调整。
推荐配置(把原/etc/sysctl.conf内容清掉,把下面内容复制进去):
net.ipv4.ip_local_port_range = 1024 65536
net.core.rmem_max=16777216
net.core.wmem_max=16777216
net.ipv4.tcp_rmem=4096 87380 16777216
net.ipv4.tcp_wmem=4096 65536 16777216
net.ipv4.tcp_fin_timeout = 10
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_window_scaling = 0
net.ipv4.tcp_sack = 0
net.core.netdev_max_backlog = 30000
net.ipv4.tcp_no_metrics_save=1
net.core.somaxconn = 262144
net.ipv4.tcp_syncookies = 0
net.ipv4.tcp_max_orphans = 262144
net.ipv4.tcp_max_syn_backlog = 262144
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syn_retries = 2
这个配置参考于cache服务器varnish的推荐配置和SunOne 服务器系统优化的推荐配置。
varnish调优推荐配置的地址为:http://varnish.projects.linpro.no/wiki/Performance
不过varnish推荐的配置是有问题的,实际运行表明“net.ipv4.tcp_fin_timeout = 3”的配置会导致页面经常打不开;并且当网友使用的是IE6浏览器时,访问网站一段时间后,所有网页都会打不开,重启浏览器后正常。可能是国外的网速快吧,我们国情决定需要调整“net.ipv4.tcp_fin_timeout = 10”,在10s的情况下,一切正常(实际运行结论)。
修改完毕后,执行:
/sbin/sysctl -p /etc/sysctl.conf
/sbin/sysctl -w net.ipv4.route.flush=1
命令生效。为了保险起见,也可以reboot系统。
调整文件数:
linux系统优化完网络必须调高系统允许打开的文件数才能支持大的并发,默认1024是远远不够的。
执行命令:
Shell代码
echo ulimit -HSn 65536 >> /etc/rc.local
echo ulimit -HSn 65536 >>/root/.bash_profile
ulimit -HSn 65536
Ⅱ 如何开放服务器1024~65536端口
众所周知,计算机之间通信是通过端口进行的,例如你访问一个网站时,Windows就会在本机开一个端口(例如1025端口),然后去连接远方网站服务器的一个端口,别人访问你时也是如此。默认状态下,Windows会在你的电脑上打开许多服务端口,黑客常常利用这些端口来实施入侵,因此掌握端口方面的知识,是安全上网必备的技能。
一、常用端口及其分类
电脑在Internet上相互通信需要使用TCP/IP协议,根据TCP/IP协议规定,电脑有256×256(65536)个端口,这些端口可分为TCP端口和UDP端口两种。如果按照端口号划分,它们又可以分为以下两大类:
1.系统保留端口(从0到1023)
这些端口不允许你使用,它们都有确切的定义,对应着因特网上常见的一些服务,每一个打开的此类端口,都代表一个系统服务,例如80端口就代表Web服务。21对应着FTP,25对应着SMTP、110对应着POP3等。
2.动态端口(从1024到65535)
当你需要与别人通信时,Windows会从1024起,在本机上分配一个动态端口,如果1024端口未关闭,再需要端口时就会分配1025端口供你使用,依此类推。
但是有个别的系统服务会绑定在1024到49151的端口上,例如3389端口(远程终端服务)。从49152到65535这一段端口,通常没有捆绑系统服务,允许Windows动态分配给你使用。
二、如何查看本机开放了哪些端口
在默认状态下,Windows会打开很多“服务端口”,如果你想查看本机打开了哪些端口、有哪些电脑正在与本机连接,可以使用以下两种方法。
1.利用netstat命令
Windows提供了netstat命令,能够显示当前的 TCP/IP 网络连接情况,注意:只有安装了TCP/IP协议,才能使用netstat命令。
操作方法:单击“开始→程序→附件→命令提示符”,进入DOS窗口,输入命令 netstat -na 回车,于是就会显示本机连接情况及打开的端口。其中Local Address代表本机IP地址和打开的端口号,Foreign Address是远程计算机IP地址和端口号,State表明当前TCP的连接状态,图中LISTENING是监听状态,表明本机正在打开135端口监听,等待远程电脑的连接。
如果你在DOS窗口中输入了netstat -nab命令,还将显示每个连接都是由哪些程序创建的。上图2中本机在135端口监听,就是由svchost.exe程序创建的,该程序一共调用了5个组件(WS2_32.dll、RPCRT4.dll、rpcss.dll、svchost.exe、ADVAPI32.dll)来完成创建工作。如果你发现本机打开了可疑的端口,就可以用该命令察看它调用了哪些组件,然后再检查各组件的创建时间和修改时间,如果发现异常,就可能是中了木马。
2.使用端口监视类软件
与netstat命令类似,端口监视类软件也能查看本机打开了哪些端口,这类软件非常多,着名的有Tcpview、Port Reporter、绿鹰PC万能精灵、网络端口查看器等,推荐你上网时启动Tcpview,密切监视本机端口连接情况,这样就能严防非法连接,确保自己的网络安全。
三、关闭本机不用的端口
默认情况下Windows有很多端口是开放的,一旦你上网,黑客可以通过这些端口连上你的电脑,因此你应该封闭这些端口。主要有:TCP139、445、593、1025 端口和 UDP123、137、138、445、1900端口、一些流行病毒的后门端口(如 TCP 2513、2745、3127、6129 端口),以及远程服务访问端口3389。关闭的方法是:
①137、138、139、445端口:它们都是为共享而开放的,你应该禁止别人共享你的机器,所以要把这些端口全部关闭,方法是:单击“开始→控制面板→系统→硬件→设备管理器”,单击“查看”菜单下的“显示隐藏的设备”,双击“非即插即用驱动程序”,找到并双击NetBios over Tcpip,在打开的“NetBios over Tcpip属性”窗口中,单击选中“常规”标签下的“不要使用这个设备(停用)”,单击“确定”按钮后重新启动后即可。
②关闭UDP123端口:单击“开始→设置→控制面板”,双击“管理工具→服务”,停止Windows Time服务即可。关闭UDP 123端口,可以防范某些蠕虫病毒。
③关闭UDP1900端口:在控制面板中双击“管理工具→服务”,停止SSDP Discovery Service 服务即可。关闭这个端口,可以防范DDoS攻击。
④其他端口:你可以用网络防火墙来关闭,或者在“控制面板”中,双击“管理工具→本地安全策略”,选中“IP 安全策略,在本地计算机”,创建 IP 安全策略来关闭。
四、重定向本机默认端口,保护系统安全
如果本机的默认端口不能关闭,你应该将它“重定向”。把该端口重定向到另一个地址,这样即可隐藏公认的默认端口,降低受破坏机率,保护系统安全。
例如你的电脑上开放了远程终端服务(Terminal Server)端口(默认是3389),可以将它重定向到另一个端口(例如1234),方法是:
1.在本机上(服务器端)修改
定位到下列两个注册表项,将其中的 PortNumber,全部改成自定义的端口(例如1234)即可:
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\Wds\rdpwd\Tds\tcp]
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp]
2.在客户端上修改
依次单击“开始→程序→附件→通讯→远程桌面连接”,打开“远程桌面连接”窗口,单击“选项”按钮扩展窗口,填写完相关参数后,单击“常规”下的“另存为”按钮,将该连接参数导出为.rdp文件。用记事本打开该文件,在文件最后添加一行:server port:i:1234 (这里填写你服务器自定义的端口)。以后,直接双击这个.rdp 文件即可连接到服务器的这个自定义端口了。
当然不会
Ⅲ 濡备綍瑙e喅链嶅姟鍣80绔鍙e崰鐢ㄧ殑闂棰桡纻
濡傛灉绔鍙h鍗犵敤锛屽彲浠ラ氲繃浠ヤ笅鍑犵嶆柟寮忚В鍐筹细
1. 镆ユ垒鍗犵敤绔鍙g殑杩涚▼骞跺叧闂瀹冿细鍙浠ヤ娇鐢ㄧ绣缁滃伐鍏锋垨钥呭懡浠よ屽伐鍏锋潵镆ユ垒鍗犵敤绔鍙g殑杩涚▼锛岀劧钖庡叧闂杩欎釜杩涚▼𨱒ラ喷鏀剧鍙c傚湪Windows绯荤粺涓锛屽彲浠ヤ娇鐢╪etstat锻戒护𨱒ユ煡镓惧崰鐢ㄧ鍙g殑杩涚▼锛涘湪Linux绯荤粺涓锛屽彲浠ヤ娇鐢╨sof锻戒护𨱒ユ煡镓惧崰鐢ㄧ鍙g殑杩涚▼銆
2. 镟存敼绔鍙e彿锛氩傛灉镞犳硶鍏抽棴鍗犵敤绔鍙g殑杩涚▼锛屽彲浠ヨ冭槛镟存敼搴旂敤绋嫔簭浣跨敤镄勭鍙e彿锛屼互阆垮厤鍐茬獊銆
3. 閰岖疆绔鍙h浆鍙戯细濡傛灉绔鍙h鍗犵敤锛屼絾镞犳硶浣跨敤涓婅堪鏂规硶瑙e喅闂棰桡纴鍙浠ヨ冭槛浣跨敤绔鍙h浆鍙戞妧链锛屽皢娴侀噺浠庤鍗犵敤镄勭鍙h浆鍙戝埌鍏朵粬鍙鐢ㄧ鍙c
浠ヤ笅鏄涓涓璇︾粏镄勪緥瀛愶纴璇存槑濡备綍阃氲繃镆ユ垒鍗犵敤绔鍙g殑杩涚▼骞跺叧闂瀹冩潵閲婃斁绔鍙o细
锅囱惧簲鐢ㄧ▼搴忛渶瑕佷娇鐢ㄧ鍙8080锛屼絾鏄璇ョ鍙e凡缁忚鍗犵敤銆傛垜浠鍙浠ヤ娇鐢ㄤ互涓嬫ラゆ潵镆ユ垒鍗犵敤璇ョ鍙g殑杩涚▼骞跺叧闂瀹冿细
1. 镓揿紑锻戒护琛岀晫闱锛圵indows绯荤粺鍙浠ヤ娇鐢╟md锛孡inux绯荤粺鍙浠ヤ娇鐢ㄧ粓绔锛夈
2. 杈揿叆浠ヤ笅锻戒护𨱒ユ煡镓惧崰鐢ㄧ鍙8080镄勮繘绋嬶纸锅囱炬搷浣灭郴缁熸槸Linux锛夛细
lsof -i:8080
杩欎釜锻戒护浼氩垪鍑哄崰鐢ㄧ鍙8080镄勮繘绋嬩俊鎭锛屽寘𨰾杩涚▼ID鍜岃繘绋嫔悕绉扮瓑銆
3. 镙规嵁杩涚▼淇℃伅锛屼娇鐢╧ill锻戒护鍏抽棴鍗犵敤绔鍙g殑杩涚▼銆备緥濡傦纴濡傛灉鍗犵敤绔鍙8080镄勮繘绋娅D鏄12345锛屽彲浠ヨ緭鍏ヤ互涓嫔懡浠ゆ潵鍏抽棴璇ヨ繘绋嬶细
kill 12345
杩欐牱锛屽氨閲婃斁浜嗙鍙8080锛屽簲鐢ㄧ▼搴忓彲浠ユe父浣跨敤璇ョ鍙d简銆
镐讳箣锛岀鍙h鍗犵敤镞跺彲浠ラ氲繃镆ユ垒鍗犵敤绔鍙g殑杩涚▼骞跺叧闂瀹冦佹洿鏀圭鍙e彿鎴栬呴厤缃绔鍙h浆鍙戠瓑鏂瑰纺𨱒ヨВ鍐炽傚叿浣撹В鍐虫柟娉曞彲浠ユ牴鎹瀹为檯𨱍呭喌阃夋嫨链阃傚悎镄勬柟妗堛
Ⅳ 服务器端口被占用怎么解决
1.运行cmd,输入netstat -ano,查看端口。
2.找到8080端口,查看在运行程序的pid。
3.再到桌面,从控制面板进入任务管理器。
4.从进程里看程序是看不到PID的,只有点右侧的详细信息,才可以看到PID。
5.找到相同的PID进程,点结束进程就可以了,这样8080端口就不会再被占用了。
6.回到服务器,重新运行一次,看看是否还有错误,如果已经没有错误,运行成功了。