专栏名称: CSDN
CSDN精彩内容每日推荐。我们关注IT产品研发背后的那些人、技术和故事。
目录
相关文章推荐
新浪科技  ·  【#张朝阳回应错失百万Labubu##张朝阳 ... ·  16 小时前  
新浪科技  ·  【#CarPlay重大更新#】在目前正在进行 ... ·  2 天前  
51好读  ›  专栏  ›  CSDN

新浪微博百万用户分布式压测实践手记

CSDN  · 公众号  · 科技媒体  · 2017-04-06 14:10

正文

请到「今天看啥」查看全文



【为什么是Tsung?】


Tsung是一个有着超过15年历史积累的性能压测工具,本身受益于Erlang天生支持并发和分布式以及实时性的特性,其进程的创建和运行非常廉价,一台机器上轻轻松松创建上百万个进程。其提供一个用户对应一个进程的隔离处理机制,单机支持虚拟用户的用户数量可支持若十万、百万级别,只要机器资源充足(但总体来讲受制于受制于网络、内存等资源,后面会具体解释)。单机计算能力总是有限的,Tsung的目的就是要把多台服务器横向扩展成分布式集群,从而可以对外提供一致的海量性能压力测试服务。


协议层,Tsung不但支持TCP/UDP/SSL传输层协议等,而且应用层协议,已支持诸如WebDAV/WebScoket/MQTT/MySQL/PGSQL/AQMP/Jabber/XMPP/LDAP等。默认情况下,开箱即用,凭借着社区的支持,市面上能够找到的公开通用协议,都有相应官方或第三方插件支持。


和nGrinder相比,Tsung定位于提供一个强大的性能测试工具,在易用性和强大可扩展方面保持了一个平衡点。基于XML + DSL提供可配置、可编程的能力。比如我们可设置上一次的响应结果作为下一次请求内容,我们可配置多种业务协议、多个业务场景作为一个整体压测等。尽力抽象所要压测的情景吧,你不会失望的。


服务资源占用方面,以单机模拟5万长连接用户为例,有数据正常交互情况下,内存占用不到3GB,CPU占用不到两核,十分经济。



单机5万长连接资源消耗


【Tsung的集群架构 & 流程】


知其然知其所以然,还是需要掌握Tsung集群大致流程的。这是一种强主从模型,简单流程梳理如下:


Tsung主从架构图


  • 主节点(tsung_controller)通过SSH通道连接到从服务器启动从节点运行时环境;

  • 主节点通过RPC方式批量启动从节点实例(tsung client);

  • 主节点为每一个从节点启动会话监控,控制会话速度,控制每一个压测用户进程ts_client生成速度;

  • 从节点请求主节点具体业务进程,获取会话指令以及会话具体内容;

  • 从节点建立到目标压测服务器的SOCKET网络连接,开始会话;

  • 主节点可以通过SSH通道连接到目标压测服务器,启动从节点,收集数据(可选)。

  • 再深入一些,以MQTT协议为例,每一种具体协议的支持可分为文件解析和会话动作的执行,运作机制不复杂,当我们在需要时可以遵循接口约定实现私有协议支持,也不是难事。



100万用户压测需要多少台机器?


要执行100万用户的性能压测,首先预估需要多少台压测服务器才能够满足要求。在Tsung中,一个压测用户对应于一个进程,一个进程默认会打开一条连接到服务器的TCP网络连接。只要内存够用(I/O密集型的应用一般吃内存),基于Erlang开发的应用程序,轻轻松松应对几十万、上百万的进程不是问题。那么我们需要把注意力转移到Linux网络资源上。一台服务器所能够提供网络IP地址数量和内存大小等主要因素,直接决定了能够承载的对外建立的网络连接数,下面我们把主要的影响因素一一列出并分析。



Tsung通用插件调用流程


【网络四元组和总连接数】


说到网络连接抽象层面构成元素,针对本机对外建立的一个TCP连接而言,需要使用到本机的IP地址(localip)和端口(localport),以及远程的主机的IP地址(targetip)和端口(targetport),可以使用网络四元组进行呈现一个连接的最小构成:


{local_ip,local_port,target_ip,target_port}


我司目前所使用的服务器操作系统大多为Centos 6.x版,受制于Linux内核限制,无论目标服务器连接地址如何变化,单机对外建立的连接数量是有限的:总连接数=本机可用IP地址数量×本机可用端口的数量。


明白了总连接数的计算方式,那么可以按图索骥,从每一个计算因子上去考虑如何扩大其连接数。


注:若要调试TCP网络四元组,诸位可使用bindp这个小工具:
https://github.com/yongboy/bindp ,十分方便。


【Linux内核端口数量的限制】


众所周知,在Linxu系统中,端口的数值范围为无符号short类型,值范围为1 ~ 65535。一般来讲1 ~ 1023范围默认只有Root用户有权限使用,普通用户可以使用区间范围1025 ~ 65535,约6万。


但你要考虑这中间很多的端口可能被已运行的程序占用,不妨打个折降低预期范围,留有5万左右的可用数值,以作缓冲。


我们可通过sysctl命令确认当前可用的端口范围,以作参考:


bash sysctl -a | grep net.ipv4.ip_local_port_range


若范围空间太小,比如1024 ~ 35525,那就需要主动扩大一下:


bash sysctl -w net.ipv4.ip_local_port_range="1024 65535" sysctl -p


【扩展阅读:IP可用数量的延伸】







请到「今天看啥」查看全文