Twisted编写的GPS数据存储服务并发连接受限问题咨询
技术求助:Twisted Python服务并发连接限制与服务运行最佳实践
背景
在Ubuntu服务器上,我将一个基于Twisted模块开发的Python脚本以服务形式运行,用于接收大量GPS设备每10秒发送的数据,解析后存入数据库。目前服务运行正常,但并发连接数被限制在1012,不确定是服务器配置还是脚本代码导致的问题。
疑问点
- 将Python脚本作为服务运行是否属于最佳实践?
- 为什么并发连接数会固定在1012这个数值?
- 如何突破这个并发连接限制?
已尝试操作
已尝试调整ulimit参数,但未生效。
相关脚本代码
#!/usr/bin/python3 class Message: """Parse message and save it in database""" class Echo(Protocol): def connectionMade(self): factory_obj.c += 1 def dataReceived(self, data): try: msg = data.decode('utf-8') except UnicodeDecodeError: pass else: message_handler.handle_message(msg) self.transport.write(data) def connectionLost(self, reason): factory_obj.c -= 1 class EchoFactory(Factory): def __init__(self): self.c = 0 def buildProtocol(self, addr): return Echo() class Db: """handles database""" factory_obj = EchoFactory() message_handler = Message() database_obj = Db() a = TCP4ServerEndpoint(reactor, 4995, interface='0.0.0.0', backlog=100000) a.listen(factory_obj) reactor.run()
问题分析与解决方案
1. 并发连接数固定为1012的原因
这个数值大概率是Linux系统文件描述符限制导致的:
- Linux默认进程文件描述符软限制为1024,1012是减去系统自身占用的描述符后的可用值。
- 你调整的
ulimit可能仅对当前会话有效,服务进程若以其他用户(如root或专用服务用户)运行,并未加载新的限制。
2. 突破并发连接限制的步骤
(1)调整系统级文件描述符限制
编辑/etc/sysctl.conf,添加:
fs.file-max = 1000000
执行sudo sysctl -p使配置生效。
(2)调整用户级文件描述符限制
编辑/etc/security/limits.conf,添加(替换为服务运行的用户名):
your_username soft nofile 65535 your_username hard nofile 65535
若服务以root运行,将your_username替换为root。
(3)确保服务进程加载新限制
- 若用systemd管理服务,在service配置文件中添加:
执行[Service] LimitNOFILE=65535sudo systemctl daemon-reload && sudo systemctl restart your-service重启服务。 - 手动启动的话,需重新登录用户后再启动服务。
(4)排查脚本潜在问题
- 验证
factory_obj.c计数准确性:在connectionMade和connectionLost中添加日志,确认连接计数与实际一致。 - 检查数据库操作是否阻塞reactor:如果
handle_message中的数据库操作是同步的,会阻塞Twisted事件循环,导致无法处理新连接。建议用Twisted的deferToThread将数据库操作放到线程池执行,避免阻塞。
3. Python脚本作为服务运行的最佳实践
将Python脚本作为服务运行是合理的,需注意以下几点:
- 用systemd管理服务:实现开机自启、进程监控、日志管理,比
nohup或手动启动更可靠。 - 使用专用用户运行:避免用root,降低权限风险。
- 添加完善日志:用Twisted的logging模块记录连接、数据解析、数据库操作等关键信息,方便排查问题。
- 配置资源限制:在systemd中设置文件描述符、内存等资源上限,防止服务耗尽系统资源。
内容的提问来源于stack exchange,提问作者Priyansh Khandelwal
相关产品推荐
相关产品推荐

