一台Linux服务器跑web网站支撑一个1000W并发的用户系统该如何做,如何接算TPS,QPS
一台Linux服务器跑web网站支撑一个1000W并发的用户系统该如何做,如何接算TPS,QPS1000W用户其实是一个非常不确定的现象,如果有经验,可以分析出高峰时段,估算响应时间,并发用户数,TPS,QPS,成功率等,使其成为高SLA服务等级
TPS(Transaction Per Second)每秒处理的事务数,一个事务是指客户端向服务端发起一个请求,并且等到请求返回之后的整个过程。从客户端发起请求开始计时,等到收到服务器端响应结果后结束计时,在计算这个时间段内总共完成的事务个数,我们称为TPS。
简单来说,一个数据库的事务操作,从开始事务到事务提交完成,表示一个完整事务,这个是数据库层面的TPS。
QPS(Queries Per Second)每秒查询数,表示服务器端每秒能够响应的查询次数。这里的查询是指用户发出请求到服务器做出响应成功的次数,可以简单认为每秒钟的Request数量。所以也可以叫RPS,QPS是服务器可承受的确认响应查询,RPS则是每秒请求数量(超出QPS时RPS则可能导致失败请求),字面意思大致相同。
用户打开一个页面到页面渲染结束代表一个TPS,那这个页面中会调用服务器很多次,比如加载静态资源、查询服务器端的渲染数据等,根据页面资源数量不同就会产生数十个QPS,因此,一个TPS中可能会包含多个QPS。
计算方式可以:QPS=并发数/平均响应时间
RT(Response Time),表示客户端发起请求到服务端返回的时间间隔,一般表示平均响应时间。
并发数是指服务器系统同时能处理的请求数量。需要注意,并发数和QPS不要搞混了,QPS表示每秒的请求数量,而并发数是服务器系统同时处理的请求数量,并发数量会大于QPS,因为服务端的一个连接需要有一个处理时长,在这个请求处理结束之前,这个连接一直占用。
如果QPS=10000,表示每秒钟客户端会发起10000个请求到服务端,而如果一个请求的处理耗时是5s,那么意味着总的并发=10000*5=50000,也就是服务端会同时有50000个并发数。
一条命令,回显数据当前已经建立连接的连接数并发:https://bbs.itzmx.com/thread-15963-1-1.html
上面说的这些指标,怎么计算呢?举个例子。
假设在10点到11点这一个小时内,有500W个用户访问我们的系统,假设平均每个用户请求的耗时是5秒,那么计算的结果如下:
QPS=5000000/60*60 = 1388(表示每秒钟会有1388个请求发送到服务端)
RT=5s(每个请求的平均响应时间是5秒)
并发数=1388*5=6940
从这个计算过程中发现,随着RT的值越大,那么并发数就越多,而并发数代表着服务器端同时处理的连接请求数量,也就意味服务端占用的连接数越多,这些链接会消耗内存资源以及CPU资源等。所以RT值越大系统资源占用越大,同时也意味着服务端的请求处理耗时较长。
但实际情况是,RT值越小越好,比如在游戏中,至少做到100ms左右的响应才能达到最好的体验,对于电商系统来说,5s左右的时间是能接受的,那么如何缩短RT的值呢?
推算1000w用户的访问量
1000W用户,每天来访问这个网站的用户占到80%,也就是每天有800W用户来访问。
假设平均每个用户过来点击50次,那么总共的PV=4亿。8000000*50=400000000
一天是24小时,每天大部分用户活跃的时间点集中在(24*0.2=4.8) 约等于5个小时以内,而大部分用户指的是(4亿点击 * 80%)约等于32000W(PV), 意味着在5个小时以内,大概会有32000W点击进来,也就是每秒大约有18000(32000W/5小时)个请求。
18000只是一个平均数字。在这5个小时中,不可能请求是非常平均的,有可能会存在大量的用户集中访问(比如像淘宝这样的网站,日访问峰值的时间点集中在下午12:00、以及晚上19:00,其中23:00是一天中活跃的峰值),一般情况下访问峰值是平均访问请求的4倍到5倍左右(这个是经验值),我们按照5倍来计算。可参考我以前分享的出口流量图:https://bbs.itzmx.com/thread-96685-1-1.html
那么在这5个小时内有可能会出现每秒90000个请求的情况。也就是说,问题由原本的支撑1000W用户,变成了一个具体的问题,就是服务器端需要能够支撑每秒90000个请求(QPS=90000)
服务器压力预估
当前服务器系统资源
我想可能大家遇到过类似“ulimit: open files: cannot modify limit: Operation not permitted”的异常,这个就是表示Linux系统中的文件句柄限制。
在Linux中,每一个TCP连接会占用一个文件描述符(fd),一旦文件描述符超过Linux系统当前的限制,就会提示这个错误。
我们可以通过下面这条命令来查看一个进程可以打开的文件数量
ulimit -a
open files (-n) 1024 是linux操作系统对一个进程打开的文件句柄数量的限制(也包含打开的套接字数量)
这里只是对用户级别的限制,其实还有个是对系统的总限制,查看系统总限制:
cat /proc/sys/fs/file-max
file-max是设置系统所有进程一共可以打开的文件数量 。同时一些程序可以通过setrlimit调用,设置每个进程的限制。如果得到大量使用完文件句柄的错误信息,是应该增加这个值。
当出现上述异常时,我们可以通过下面的方式来进行修改(针对单个进程的打开数量限制)
ulimit -n 1048576
echo "* soft nofile 1048576" >> /etc/security/limits.conf
echo "* hard nofile 1048576" >> /etc/security/limits.conf
另外还要注意,要确保针对进程级别的文件打开数量范围是小于或者等于系统的总限制,否则,我们需要修改系统的总限制。
可以参考这篇文章,一位朋友的大并发案例:https://bbs.itzmx.com/thread-99642-1-1.html
TCP连接对于系统资源最大的开销就是内存。
因为tcp连接归根结底需要双方接收和发送数据,那么就需要一个读缓冲区和写缓冲区,这两个buffer在linux下最小为4096字节,可通过cat /proc/sys/net/ipv4/tcp_rmem和cat /proc/sys/net/ipv4/tcp_wmem来查看。
所以,一个tcp连接最小占用内存为4096+4096 = 8k,那么对于一个8G内存的机器,在不考虑其他限制下,最多支持的并发量为:8*1024*1024/8 约等于100万连接数并发。此数字为纯理论上限数值,在实际中,由于linux kernel对一些资源的限制,加上程序的业务处理,所以,8G内存是很难达到100万连接的,当然,我们也可以通过增加内存的方式增加并发量。
参考8G的内存机器跑到60W并发:https://bbs.itzmx.com/thread-7232-1-1.html#:~:text=kangle%20web%20server%208%E6%A0%B8%E5%BF%838G%E5%86%85%E5%AD%98VPS%E5%AE%9E%E6%B5%8B%E8%B7%9160W%E5%B9%B6%E5%8F%91%E8%BF%9E%E6%8E%A5%E6%95%B0%EF%BC%88%E9%9D%9E%E6%AF%8F%E7%A7%92%EF%BC%8C%E4%B8%80%E5%88%86%E9%92%9F%E5%86%8560W%E5%90%AF%E7%94%A8%E9%95%BF%E8%BF%9E%E6%8E%A5%EF%BC%89%E5%A6%A5%E5%A6%A5%E7%9A%84
未待完续,文章等待补充 1000W 并发要看跑的是啥应用吧,DNS 检索之类的还是有可能性的
页:
[1]