如何优雅停止高并发XMPP压力场景下运行的Tsung进程?
高并发XMPP压测场景下Tsung进程的优雅终止实操
核心原则
绝对不要上来用kill -9强杀进程。带10万XMPP长连接并发的Tsung进程,强杀会瞬间在被压XMPP服务端刷出大量异常断连的脏日志,同时压测侧的采集数据会直接丢失,后续根本没法生成完整的压测报告。
标准优雅终止流程
- 首先定位Tsung的主控制进程PID:执行
ps aux | grep tsung,筛选出带tsung start启动参数的那个进程,注意区分各个工作节点上的Erlang worker进程,只有主控制进程才是全局的流程调度入口。 - 给主控制进程发送SIGTERM终止信号:
kill -TERM <上面查到的主进程PID>
这个信号会触发Tsung内置的优雅退出逻辑,完整流程包括:- 立刻停止生成新的压测请求,不再唤起新的XMPP会话
- 同步通知所有分布式工作节点上承载的10万XMPP连接,逐一按照XMPP协议规范走正常下线流程(发送离线Presence报文、正常关闭XML流、四次挥手断开TCP连接),不会直接掐断连接
- 等所有会话的断连流程全部走完后,把已经采集到的吞吐量、响应时间、成功率等压测指标全量落盘到Tsung的工作log目录,生成完整的统计报告
- 最后自动退出主节点、所有工作节点的相关进程,整个过程不需要人工逐台操作工作机。
高负载场景的注意事项
因为10万并发的场景下,Tsung主节点的CPU、内存负载都处于高位,信号接收、流程调度会有延迟,不要看到进程没立刻退出就反复强杀:
- 给主进程留1-3分钟的处理时间,毕竟10万长连接逐一走协议下线握手本身就需要一定时长,不是程序卡死。
- 如果超过5分钟主进程依然没有退出,不要直接用
pkill beam这类命令扫杀所有Erlang进程,这种操作会误杀机器上其他独立运行的Erlang服务(比如本地的RabbitMQ、其他业务系统)。正确操作是先定位所有和Tsung集群关联的Erlang worker节点,逐个发送SIGTERM信号,最后再给主控制进程发一次SIGTERM触发收尾。
常见操作坑
- 不要直接在Tsung运行的终端按Ctrl+C触发SIGINT退出,这个信号的处理逻辑会跳过部分长连接的正常下线流程,只等当前在途的短请求跑完就直接断连,会在XMPP服务端残留大量超时清理的僵尸会话,污染压测结果。
- 优雅停止的过程中不要手动删除Tsung工作目录下的log文件,进程还在持续写入压测数据,强行删除会导致最终的统计报告文件损坏,前面攒的所有压测数据都没法正常解析。
内容的提问来源于stack exchange,提问作者Abdullah Al Mamun
相关产品推荐
相关产品推荐

