如何提高服务器并发能力
有什么方法衡量服务器并发处理能力
1 吞吐率
吞吐率,单位时间里服务器处理的最大请求数,单位req/s
从服务器角度,实际并发用户数的可以理解为服务器当前维护的代表不同用户的文件描述符总数,也就是并发连接数。服务器一般会限制同时服务的最多用户数,比如apache的MaxClents参数。
这里再深入一下,对于服务器来说,服务器希望支持高吞吐率,对于用户来说,用户只希望等待最少的时间,显然,双方不能满足,所以双方利益的平衡点,就是我们希望的最大并发用户数。
2 压力测试
有一个原理一定要先搞清楚,假如100个用户同时向服务器分别进行10个请求,与1个用户向服务器连续进行1000次请求,对服务器的压力是一样吗?实际上是不一样的,因对每一个用户,连续发送请求实际上是指发送一个请求并接收到响应数据后再发送下一个请求。这样对于1个用户向服务器连续进行1000次请求, 任何时刻服务器的网卡接收缓冲区中只有1个请求,而对于100个用户同时向服务器分别进行10个请求,服务器的网卡接收缓冲区最多有100个等待处理的请求,显然这时的服务器压力更大。
压力测试前提考虑的条件
并发用户数: 指在某一时刻同时向服务器发送请求的用户总数(HttpWatch)
总请求数
请求资源描述
请求等待时间(用户等待时间)
用户平均请求的等待时间
服务器平均请求处理的时间
硬件环境
压力测试中关心的时间又细分以下2种:
用户平均请求等待时间(这里暂不把数据在网络的传输时间,还有用户PC本地的计算时间计算入内)
服务器平均请求处理时间
用户平均请求等待时间主要用于衡量服务器在一定并发用户数下,单个用户的服务质量;而服务器平均请求处理时间就是吞吐率的倒数,一般来说,用户平均请求等待时间 = 服务器平均请求处理时间 并发用户数
怎么提高服务器的并发处理能力
1 提高CPU并发计算能力
服务器之所以可以同时处理多个请求,在于操作系统通过多执行流体系设计使得多个任务可以轮流使用系统资源,这些资源包括CPU,内存以及I/O 这里的I/O主要指磁盘I/O, 和网络I/O。
多进程 & 多线程
多执行流的一般实现便是进程,多进程的好处可以对CPU时间的轮流使用,对CPU计算和IO操作重叠利用。这里的IO主要是指磁盘IO和网络IO,相对CPU而言,它们慢的可怜。
而实际上,大多数进程的时间主要消耗在I/O操作上。现代计算机的DMA技术可以让CPU不参与I/O操作的全过程,比如进程通过系统调用,使得CPU向网卡或者磁盘等I/O设备发出指令,然后进程被挂起,释放出CPU资源,等待I/O设备完成工作后通过中断来通知进程重新就绪。对于单任务而言,CPU大部分时间空闲,这时候多进程的作用尤为重要。
多进程不仅能够提高CPU的并发度。其优越性还体现在独立的内存地址空间和生命周期所带来的稳定性和健壮性,其中一个进程崩溃不会影响到另一个进程。
但是进程也有如下缺点:
fork()系统调用开销很大: prefork
进程间调度和上下文切换成本: 减少进程数量
庞大的内存重复:共享内存
IPC编程相对比较麻烦
没有准确的答案的。
这款配置还是相对较高的配置,以官网来说,每天大概500ip,PV大概3000左右,同时在线人数最多不会超过50人吧,这种流量相对一个企业站来说还算可以,这个服务器完全可以符合要求,目前运行了相当长时间,服务器没有出现过任何中断,截取Alexa的排名数据仅供参考。
扩展资料:
这款配置的峰值并发用户应该可以到几百个用户,这里有太多因素决定同时并发数了,比如网站视频数量多少,数据库是否和文件服务器分开,每个用户在站点上打开的页面多少等都会影响服务器负载。
另外这些数据其实都只是一个预估的数据,显示情况远比理想状况复杂很多很多,比如要是在这台服务器安装配置一些额外的服务,而当前服务运行的进程可能就会直接对服务器造成负载的提升等等。
因此能支持多少用户这种问题本身就是一个伪命题,要具体情况具体分析,不过可以肯定的是这个配置可以支持绝大部分企业站点的正常运行相当长时间。
——服务器
尽量使用缓存,包括用户缓存,信息缓存等,多花点内存来做缓存,可以大量减少与数据库的交互,提高性能。
1、用jprofiler等工具找出性能瓶颈,减少额外的开销。优化数据库查询语句,减少直接使用hibernate等工具的直接生成语句(仅耗时较长的查询做优化)。优化数据库结构,多做索引,提高查询效率。
2、统计的功能尽量做缓存,或按每天一统计或定时统计相关报表,避免需要时进行统计的功能。
3、能使用静态页面的地方尽量使用,减少容器的解析(尽量将动态内容生成静态html来显示)。
4、解决以上问题后,使用服务器集群来解决单台的瓶颈问题。基本上以上述问题解决后,达到系统最优。
服务程序最为关键的设计是并发服务模型,当前有以下几种典型的模型:
- 单进程服务,使用非阻塞IO
使用一个进程服务多个客户,通常与客户通信的套接字设置为非阻塞的,阻塞只发生在select()、poll()、epoll_wait()等系统调用上面。这是一种行之有效的单进程状态机式服务方式,已被广泛采用。
缺点是它无法利用SMP(对称多处理器)的优势,除非启动多个进程。此外,它尝试就绪的IO文件描述符后,立即从系统调用返回,这会导致大量的系统调用发生,尤其是在较慢的字节传输时。
select()本身的实现也是有局限的:能打开的文件描述符最多不能超过FD_SETSIZE,很容易耗尽;每次从select()返回的描述符组中扫描就绪的描述符需要时间,如果就绪的描述符在末尾时更是如此(epoll特别彻底修复了这个问题)。
- 多进程服务,使用阻塞IO
也称作 accept/fork 模型,每当有客户连线时产生一个新的进程为之服务。这种方式有时是必要的,比如可以通过操作系统获得良好的内存保护,可以以不同的用户身份运行程序,可以让服务运行在不同的目录下面。但是它的缺点也很明显:进程比较占资源,进程切换开销太大,共享某些信息比较麻烦。Apache 13就使用了这种模型,MaxClients数很容易就可以达到。
- 多线程服务,使用阻塞IO
也称之 accept/pthread_create模型,有新客户来时创建一个服务线程而不是服务进程。这解决了多进程服务的一些问题,比如它占用资源少,信息共享方便。但是麻烦在于线程仍有可能消耗光,线程切换也需要开销。
- 混合服务方式
所谓的混合服务方式,以打破服务方和客户方之间严格的1:1关系。基本做法是:
新客户到来时创建新的工作线程,当该工作线程检测到网络IO会有延迟时停止处理过程,返回给Server一个延迟处理状态,同时告诉 Server被延迟的文件描述符,延迟超时时间。Server会在合适的时候返回工作线程继续处理。注意这里的工作线程不是通过 pthread_create()创建的,而是被包装在专门用于处理延迟工作的函数里。
这里还有一个问题,工作线程如何检测网络IO会有延迟?方法有很多,比如设置较短的超时时间调用poll(),或者甚至使用非阻塞IO。如果是套接字,可以设置SO_RCVTIMEO和SO_SNDTIMEO选项,这样更有效率。
除了延迟线程,Server还应提供了未完成线程的支持。
如有有特别耗费时间的操作,你可以在完成部分工作后停止处理,返回给Server一个未完成状态。这样Server会检查工作队列是否有别的线程,如果有则让它们运行,否则让该工作线程继续处理,这可以防止某些线程挨饿。
典型的一个混合服务模型开源实现ServerKit
Serverkit的这些线程支持功能可简化我们的服务程序设计,效率上应该也是有保证的。
2 队列(queue)
ServerKit提供的队列是一个单向链表,队列的存取是原子操作,如果只有一个执行单元建议不要用,因为原子操作的开销较大。
3 堆(heap)
malloc()分配内存有一定的局限,比如在多线程的环境里,需要序列化内存分配操作。ServerKit提供的堆管理函数,可快速分配内存,可有效减少分配内存的序列化操作,堆的大小可动态增长,堆有引用计数,这些特征比较适合多线程环境。目前ServerKit堆的最大局限是分配单元必须是固定大小。
4 日志记录
日志被保存在队列,有一个专门的线程处理队列中的日志记录:它或者调用syslog()写进系统日志,或者通过UDP直接写到远程机器。后者更有效。
5 读写锁
GNU libc也在pthreads库里实现了读写锁,如果定义了__USE_UNIX98就可以使用。不过ServerKit还提供了读写锁互相转换的函数,这使得锁的应用更为弹性。比如拥有读锁的若干个线程对同一个hash表进行检索,其中一个线程检索到了数据,此时需要修改它,一种办法是获取写锁,但这会导致释放读锁和获取写锁之间存在时间窗,另一种办法是使用ServerKit提供的函数把读锁转换成写锁,无疑这种方式更有效率。
除了以上这些功能,ServerKit还提供了数据库连接池的管理(当前只支持MySQL)和序列化(Sequences),如感兴趣可参见相关的API文档。
二、ServerKit服务模块编写
ServerKit由3部分组成:server程序,负责加载服务模块、解析配置文件、建立数据库连接池;libserver,动态链接库,提供所有功能的库支持,包括server本身也是调用这个库写的;API,编程接口,你编写的服务模块和ServerKit框架进行对话的接口。
ServerKit需要libConfuse解析配置文件,所以出了安装ServerKit,还需要安装libConfuse。关于libConfuse可参考 http://wwwnongnuorg/confuse/ 。
下面我们看一个简单的服务模块FOO:
#include <confuseh>
#include <serverh>
static long int sleep_duration;
static int FOO_construct()
{
fprintf(stderr, "FOO_construct\n");
return 1;
}
static int FOO_prestart(cfg_t configuration)
{
fprintf(stderr, "FOO_prestart\n");
return 1;
}
static void FOO_operator(void foobar)
{
fprintf(stderr, "FOO_operator\n");
for(;;) sleep(sleep_duration);
return NULL;
}
static void FOO_report(void)
{
fprintf(stderr, "FOO_report\n");
}
static cfg_opt_t FOO_config[] = {
CFG_SIMPLE_INT("sleep_duration", &sleep_duration),
CFG_END()
};
static char FOO_authors[] = {"Vito Caputo <vcaputo@pengarucom>", NULL};
SERVER_MODULE(FOO,0,0,1,"Example module that does nothing but sleep")
按以下方法编译:
$ gcc -c -fPIC -pthread -D_REENTRANT -g FOOc
$ gcc -shared -lserver -lconfuse -lpthread -g -e __server_module_main -o FOOso FOOo
-e选项指定程序运行入口,这使得你可以直接在命令行敲 /FOOso 运行模块。
server程序根据环境变量SERVER_PERSONALITY_PATH定位主目录,并查找主目录下的c11n作为配置文件,动态加载的模块需放在主目录下的modules目录。
$ export SERVER_PERSONALITY_PATH=`pwd`
$ mkdir modules
$ cp FOOso modules
$ vi c11n
c11n的内容:
identity = "any_id"
FOO {
sleep_duration = 1;
}
identity标识server实例,用ps可看到程序名称形如serveridentity,本例为serverany_id。
执行server启动服务程序。
三、ServerKit其他功能缺陷
缺乏daemon模式;
只能运行在Linux box;
DB pool只支持MySQL;
Heap管理内存的功力有限
并发数 不能作为配置参考
关键是你网站 和数据的性质啊
说个例子你就明白了
如果是视频站 并发1000 那可实实在在同时的高流量并发
必须高带宽 高配置应对
可如果是文字小说站呢 那就算并发也没那么大影响
你也知道你普通的并发 和那8000的区别了
所以关键不是数字 而是性质 决定配置
1、查看Web服务器(Nginx Apache)的并发请求数及其TCP连接状态: netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'netstat -n|grep ^tcp|awk '{print $NF}'|sort -nr|uniq -c 或者:netstat -n | awk '/^tcp/ {++state[$NF]} END {for(key in state) print key,"t",state[key]}'返回结果一般如下: LAST_ACK 5 (正在等待处理的请求数)SYN_RECV 30ESTABLISHED 1597 (正常数据传输状态)FIN_WAIT1 51FIN_WAIT2 504TIME_WAIT 1057 (处理完毕,等待超时结束的请求数) 其他参数说明: CLOSED:无连接是活动的或正在进行LISTEN:服务器在等待进入呼叫SYN_RECV:一个连接请求已经到达,等待确认SYN_SENT:应用已经开始,打开一个连接ESTABLISHED:正常数据传输状态FIN_WAIT1:应用说它已经完成FIN_WAIT2:另一边已同意释放ITMED_WAIT:等待所有分组死掉CLOSING:两边同时尝试关闭TIME_WAIT:另一边已初始化一个释放LAST_ACK:等待所有分组死掉 2、查看Nginx运行进程数ps -ef | grep nginx | wc -l返回的数字就是nginx的运行进程数,如果是apache则执行ps -ef | grep httpd | wc -l 3、查看Web服务器进程连接数:netstat -antp | grep 80 | grep ESTABLISHED -c 4、查看MySQL进程连接数:ps -axef | grep mysqld -c
不久前,全球首款亿级并发云服务器系统在天津正式量产,该产品是“十二五”国家863计划信息技术领域“云计算关键技术与系统(二期)”重大专项的成果。
那么,什么是云服务器,和云计算又有什么关系?这款云服务器有何特殊之处呢?
什么是云计算?
(来源于网络)
云计算是一种基于互联网的计算方式。狭义的云计算是指以计算、存储为核心的IT硬件、软件乃至IT基础设施资源以服务形式进行交付和使用的模式,指用户可以通过网络以按需、易扩展的方式获得所需的IT资源。广义的云计算泛指服务的交付和使用模式,指用户通过网络以按需、易扩展的方式获得所需的服务,这种服务既可以是IT硬件、软件、互联网技术相关的,也可以是任意其他的服务。
一般说来,云计算具有大规模、资源池化、快速弹性、泛在接入访问、按需自服务、服务可计量等特征,如果说互联网是一个神经网络的话,云计算就是它的中枢神经,云计算将互联网的核心硬件层,核心软件层和互联网信息层统一起来,并进行管理、调度,为互联网各系统提供支持和服务。在理想状态下,互联网使用者和物联网传感器通过网络线路和计算机终端与云计算进行交互,向云计算提供数据,接受云计算提供的服务。
目前,世界经济较发达国家和地区大多推出政策支持云计算核心技术的革新——在2012年,欧盟启动了“释放欧洲云计算潜力”的战略计划;在2014年,美国国家标准与技术研究所发布了《美国政府云计算技术路线图》;我国也在《国家“十二五”规划纲要》中把云计算列为重点发展的战略性新兴产业,提出构建下一代信息基础设施,加强云计算服务平台建设。可以说,云计算将成为世界各国抢占科技经济发展制高点的途径之一。
什么是云服务器?
(来源于网络)
云服务器是专门面向云计算需求的服务器,最大的特点就在于性能功耗比和整体服务能力较传统架构服务器有显著提升。传统通用服务器架构搭建的数据中心,优点是可以应对各种场景,然而,采用这种万精油式的产品进行数据中心的搭建,也带来相应的弊端,其中很重要的一点就是,没有针对性,各项指标表现平平。然而云数据中心应对的任务中,各自场景并非平均分布,相反云数据中心每天需要应对大量的高并发访问及信息查询,同时,又对计算量要求不高,这就造成了云数据中心每天疲于应付海量并发,而计算性能却白白浪费掉,同时能耗大也是采用服务器面临的问题。对于云计算应用中大量网络托管、网页服务器集群等网络带宽密集型应用而言,平均CPU利用率仅为20%左右,造成了成本的浪费。
相比之下,云服务器体系构架有别于传统的服务器,以本次曙光发布的全球首款亿级并发云服务器系统来说,该产品放弃了通用服务器所采用的芯片组,针对云计算业务应用的特点进行了优化,用3D Torus网络实现节点服务器的互联,实现单路直连高耦合体系架构,其中每个处理器可以独占25bpsG带宽,可以实现快速响应。在结构上大幅精简,实现散热、电源、管理监控模块、计算、网络全共享,不仅降低了成本,又提高了系统的稳定性和可靠性。
解决了硬件资源虚拟化技术难题
随着云计算、大数据时代的到来,云计算中心和数据中心部署的集群系统规模都非常大,计算节点大多以千为单位计算,在计算节点如此之多的情况下,要提高效率和效能,就离不开资源共享——当应用需要性能很强的时候,就配置高一些,把内存、网络、计算资源多占一些,当应用需要性能不强的时候,就配置低一些,把内存、网络、计算资源释放一些。
然而,传统服务器是独立架构,无法从硬件上实现服务器间资源共享。虽然可以通过软件,从上层来进行资源分配,但是这种做法会带来额外的开销,导致性能损失。而这恰恰与云计算中心和数据中心的运营者要求的高效率和高能效相违背。本次量产的全球首款亿级并发云服务器则实现了从硬件上来实现资源共享,把存储、网络、计算资源池化,根据用户的需求来配置,根据应用不同来提供不同的配置。亿级并发云服务器内部设计有一套高性能互连网络,确保从硬件上进行资源共享时性能损失非常小。
实现硬件资源共享,有两个关键,一个是在体系结构上做出革新,比如存储共享架构、网络共享架构等等,另一个是要在硬件上能够实现,包括系统控制器、高性能互连网络、通信协议等等。
在体系结构上,该产品采用的是分布式资源共享架构。曾经有国外公司主张做集中式资源共享——把存储、网络、计算资源按类别集中放置,通过互连网络连起来,想用多少资源去远端去取就可以了,但这种体系结构的灵活性不不足,当系统规模扩大到一定规模,就会带来很多问题。如果是几十个节点还好说,上百个节点都去一个地方取资源的话一定会有瓶颈。曙光公司提出并实现了一种分布式资源共享架构,相对于集中式资源共享架构,分布式资源共享的好处在于存储、网络等资源以计算为核心分布在处理器周边,处理器本地资源可以自己优先使用,不够的话可以去远端别的处理器那去取,这样可扩张性和整机效率就远远高于集中式资源共享。
在硬件上来实现则是要有性能足够好的CPU、互连网络、存储等硬件,虽然在CPU上采用的是Intel的产品,但互连网络是曙光自主研发的,而且还实现了全面而完备的硬件资源虚拟化——计算,存储,网络,内存等都是基于硬件协议层来实现共享的,比如存储,基于SATA/SAS协议的共享控制器实现了存储资源的虚拟化。
必须说明的是,虽然硬件虚拟化的理念人所共知,而且也知道是未来的大趋势,但如何去实现就是另一回事了。
实际上,国外也在向服务器硬件虚拟化方向发展,但至今未见成功的产品面世。与国外的情况相反,在云服务器硬件虚拟化上,中国不仅在技术上实现了,而且做出了工业化量产的产品,更可贵的是,还在实际应用中取得了效果。相比之下,还没有国外厂能做到这一步,换言之,在云服务器硬件虚拟化上,中国已经走在外国前列。
云服务器相对于传统服务器具有哪些优势
云服务器相对于传统服务器有多大优势呢?就以曙光公司发布的云服务器为例,一台32 CPU的云服务器日处理HTTP请求数大于900亿次,64台云服务器组成的云服务器系统,负载并发处理能力大于1亿。与传统架构相比,云服务器可以实现节点性能功耗比提升3倍以上,总拥有成本降低70%。与业内最好的传统架构服务器相比空间占用减少50%,系统复杂性降低60%。
高并发处理能力有和意义呢?12306自开通以来,几乎每年春运都会出现系统崩溃,无法订票或查询的现象,这一方面是因为访问量实在太高且超出了服务器的处理能力,另一方面是因为采用传统架构服务器的数据中心应对海量并发访问的能力不足。如果不从根本上解决传统架构与云应用不匹配的问题,单纯地加大硬件投入,堆砌并发数,不仅无法解决日益上升的高并发访问,还会导致成本、空间、能耗的上升,对于解决系统崩溃问题于事无补。而云服务器恰恰是针对高并发要求、低计算场景的要求而研制的,对于应对大量的高并发访问场景可谓得心应手。
除了强悍的并发处理能力外,云服务器在密度和功耗上的特性也使其具备一定优势——当前较大的数据中心服务器集群由超过百万台服务器组成,不少数据中心的功耗往往超过20MW,数据中心电费成本已经在使用维护成本中占到很大比例,而电力和空间都是相对宝贵的资源,能够节能降耗和减少服务器空间占用,对于数据中心而言意义重大。
正是因为云服务器在能效比、空间和成本上相对于现有的整机柜服务器有巨大的优势,使得数据中心的拥有者、运营者、甚至使用者都对云服务器青睐有加,云服务器也将随着云计算、大数据的兴起而获得广阔的市场。
出品:科普中国
制作:铁流
监制:中国科学院计算机网络信息中心
“科普中国”是中国科协携同社会各方利用信息化手段开展科学传播的科学权威品牌。
本文由科普中国融合创作出品,转载请注明出处。
并发的意思是指网站在同一时间访问的人数,人数越大,瞬间带宽要求更高。服务器并发量分为:
1业务并发用户数;
2最大并发访问数;
3系统用户数;
4同时在线用户数;
0条评论