立即注册 登录
江大论坛 返回首页

游民的个人空间 http://home.da.jx.cn/?7 [收藏] [复制] [分享] [RSS]

日志

TCP端口占满mysql报Can't connect to MySQL (10048)

已有 590 次阅读2013-1-23 09:24 |个人分类:技术相关| mysql, 10048, MaxUserPort

转自 http://desert3.javaeye.com/blog/814052

用python程序读取csv数据,然后通过MySQLdb模块插入到数据库,程序运行一小段随机时间后,报错: 
_mysql_exceptions.OperationalError: (2006, 'MySQL server has gone away') 
OperationalError: (2003, "Can't connect to MySQL server on '192.168.3.250' (10048)") 

程序出异常时,当前连接数高达3K多,同时TCP可用端口被占满 

错误出现的原因: 
程序处理时,每插入一条数据都经过取得连接,执行插入操作,提交事务,关闭连接的操作。而程序每取得一次新的数据库连接,操作系统都对应开打一个新的TCP请求,端口号是随机取得可用的,而程序关闭数据库连接时,相应的操作系统关闭TCP连接,此时TCP连接并没有被释放,然后占用着操作系统端口,等待回收 
由于默认已关闭TCP连接的回收间隔为240S,最大的可用TCP端口号为5000,当创建连接速度过快导致所有可用的小于5000的端口号被占满后,系统报错。 

解决方案: 
和本错误密切相关的两个windows的注册表项:TcpTimedWaitDelay和MaxUserPort的值. 
TcpTimedWaitDelay 确定 TCP/IP 可释放已关闭连接并重用其资源前, 必须经过的时间. 关闭和释放之间的此时间间隔通称 TIME_WAIT 状态或两倍最大段生命周期(2MSL)状态. 此时间期间, 重新打开到客户机和服务器的连接的成本少于建立新连接. 减少此条目的值允许 TCP/IP 更快地释放已关闭的连接, 为新连接提供更多资源. 

MaxUserPort 确定从系统请求任何可用用户端口时所用最大端口数,TCP/IP 可指定的最高端口号. 如果建立 TCP 连接最大端口连接大于 5000, 本地计算机响应以下错误信息WSAENOBUFS (10055): 因为系统缺乏足够缓冲区或者因为队列已满而无法执行套接字上操作, 从而导致应用程序的10048错误. 

打开注册表编辑器regedit 

TcpTimedWaitDelay 设置: 
找到 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\ Services\TCPIP\Parameters 注册表子键 
并创建名为 TcpTimedWaitDelay 的新 REG_DWORD 值 
设置此值为十进制 30, 十六进制为 0×0000001e 
该值等待时间将是 30 秒。 
本项的默认值:0xF0(16进制), 等待时间设置为 240 秒 

MaxUserPort 设置(增加最大值端口连接): 
找到 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\ Services\TCPIP\Parameters 注册表子键 
并创建名为 MaxUserPort 的新 REG_DWORD 值 
设置此值为十进制最低 32768 
该值等待时间将是 30 秒。 
重启windows系统。 
本项的默认值:5000(十进制) 

关闭注册表编辑器, 重启windows系统。


路过

鸡蛋

鲜花

握手

雷人

评论 (0 个评论)

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 立即注册
验证码 换一个

关于我们| 网站地图| 帮助中心| 商务合作| 法律声明| 诚聘英才| 联系我们
Copyright (c) 2007 - 2013 江西大网 版权所有. All Rights Reserved
赣ICP备08003056号
腾讯分析
回顶部