几个月前,服务器团队突然提出了一个需求,他们发现一台服务器和收集器-写入服务运行缓慢,因为遇到了意外的大量数据,他们急需一个解决方案。
本文分为两部分:(1) 调整TIME_WAIT限制和(2) 调整文件描述符限制。
NETSTAT是一个显示协议统计信息和当前TCP/IP网络连接的命令。如果运行一个netstat -a命令,会看到不同的连接状态,如ESTABLISHED, LISTENING, CLOSE_WAIT... TIME_WAIT。TIME_WAIT状态是连接等待指定时间(默认是240秒,即4分钟)后关闭的状态,如果服务器/系统上有大量的TIME_WAIT状态连接,那么它可能会限制最大连接数,减少这个TIME_WAIT默认周期将增加系统的连接上限。要减少/修改TIME_WAIT默认周期,需要修改'TcpTimedWaitDelay'注册表键的值。'TcpTimedWaitDelay'的值决定了连接在TIME_WAIT状态下保持的时间长度,然后被关闭。按照以下步骤编辑'TcpTimedWaitDelay'设置。
步骤1:转到注册表键-- HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
步骤2:创建一个新的DWORD (REG_DWORD)值,或者如果已经存在,则修改现有的名为'TcpTimedWaitDelay'的值。
步骤3:将值设置在30-300秒(十进制)之间。
步骤4:退出注册表,然后重新启动系统。
文件描述符限制是程序可以同时打开的文件数量的上限。Windows在'stdio级别'有一个硬性的上限文件描述符限制为512,即任何程序都可以同时打开512个文件,但使用C运行时库,Windows硬性上限的文件描述符可以扩展到2048,即任何程序都可以同时打开多达2048个文件,使用C运行时'setmaxstdio'调用。
要更改文件描述符的限制,应用程序可以使用'setmaxstdio' CRT调用来更改可能同时打开的文件数量的最大值。附加的应用程序FileDescriptor.exe使用'setmaxstdio'调用。
应用程序FileDescriptor.exe有五个选项:
检查平台/配置的默认文件描述符限制。这个选项允许检查系统的默认文件描述符限制。
检查平台/配置的默认文件描述符限制,并通过同时创建相同数量的文件来验证,而不使用'setmaxstdio'调用。这个选项允许通过同时创建和打开相同数量的文件来检查系统的默认文件描述符限制。
将当前文件描述符限制设置为:
这个选项允许使用'setmaxstdio'调用来设置系统的文件描述符限制。
将当前文件描述符限制设置为,并验证通过同时创建相同数量的文件。这个选项允许使用'setmaxstdio'调用来设置系统的文件描述符限制,并允许同时创建和打开相同数量的文件。
有关更多详细信息,请查看源代码。
如果应用程序需要同时打开超过2048个文件,那么应用程序应该使用原生Win32 API调用(例如CreateFile)而不是C运行时库。