You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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=65535
    
    执行sudo 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 15:03:27