导航:首页 > 源码编译 > 服务性能算法优化

服务性能算法优化

发布时间:2022-12-24 21:45:23

linux系统性能怎么优化

linux系统性能怎么优化
一、前提
我们可以在文章的开始就列出一个列表,列出可能影响Linux操作系统性能的一些调优参数,但这样做其实并没有什么价值。因为性能调优是一个非常困难的任务,它要求对硬件、操作系统、和应用都有着相当深入的了解。如果性能调优非常简单的话,那些我们要列出的调优参数早就写入硬件的微码或者操作系统中了,我们就没有必要再继续读这篇文章了。正如下图所示,服务器的性能受到很多因素的影响。
当面对一个使用单独IDE硬盘的,有20000用户的数据库服务器时,即使我们使用数周时间去调整I/O子系统也是徒劳无功的,通常一个新的驱动或者应用程序的一个更新(如SQL优化)却可以使这个服务器的性能得到明显的提升。正如我们前面提到的,不要忘记系统的性能是受多方面因素影响的。理解操作系统管理系统资源的方法将帮助我们在面对问题时更好的判断应该对哪个子系统进行调整。
二、Linux的CPU调度
任何计算机的基本功能都十分简单,那就是计算。为了实现计算的功能就必须有一个方法去管理计算资源、处理器和计算任务(也被叫做线程或者进程)。非常感谢Ingo Molnar,他为Linux内核带来了O(1)CPU调度器,区别于旧有的O(n)调度器,新的调度器是动态的,可以支持负载均衡,并以恒定的速度进行操作。
新调度器的可扩展性非常好,无论进程数量或者处理器数量,并且调度器本身的系统开销更少。新调取器的算法使用两个优先级队列。
引用
・活动运行队列
・过期运行队列
调度器的一个重要目标是根据优先级权限有效地为进程分配CPU 时间片,当分配完成后它被列在CPU的运行队列中,除了 CPU 的运行队列之外,还有一个过期运行队列。当活动运行队列中的一个任务用光自己的时间片之后,它就被移动到过期运行队列中。在移动过程中,会对其时间片重新进行计算。如果活动运行队列中已经没有某个给定优先级的任务了,那么指向活动运行队列和过期运行队列的指针就会交换,这样就可以让过期优先级列表变成活动优先级的列表。通常交互式进程(相对与实时进程而言)都有一个较高的优先级,它占有更长的时间片,比低优先级的进程获得更多的计算时间,但通过调度器自身的调整并不会使低优先级的进程完全被饿死。新调度器的优势是显着的改变Linux内核的可扩展性,使新内核可以更好的处理一些有大量进程、大量处理器组成的企业级应用。新的O(1)调度器包含仔2.6内核中,但是也向下兼容2.4内核。
新调度器另外一个重要的优势是体现在对NUMA(non-uniform memory architecture)和SMP(symmetric multithreading processors)的支持上,例如INTEL@的超线程技术。
改进的NUMA支持保证了负载均衡不会发生在CECs或者NUMA节点之间,除非发生一个节点的超出负载限度。
三、Linux的内存架构
今天我们面对选择32位操作系统还是64位操作系统的情况。对企业级用户它们之间最大的区别是64位操作系统可以支持大于4GB的内存寻址。从性能角度来讲,我们需要了解32位和64位操作系统都是如何进行物理内存和虚拟内存的映射的。
在上面图示中我们可以看到64位和32位Linux内核在寻址上有着显着的不同。
在32位架构中,比如IA-32,Linux内核可以直接寻址的范围只有物理内存的第一个GB(如果去掉保留部分还剩下896MB),访问内存必须被映射到这小于1GB的所谓ZONE_NORMAL空间中,这个操作是由应用程序完成的。但是分配在ZONE_HIGHMEM中的内存页将导致性能的降低。
在另一方面,64位架构比如x86-64(也称作EM64T或者AMD64)。ZONE_NORMAL空间将扩展到64GB或者128GB(实际上可以更多,但是这个数值受到操作系统本身支持内存容量的限制)。正如我们看到的,使用64位操作系统我们排除了因ZONE_HIGHMEM部分内存对性能的影响的情况。
实际中,在32位架构下,由于上面所描述的内存寻址问题,对于大内存,高负载应用,会导致死机或严重缓慢等问题。虽然使用hugemen核心可缓解,但采取x86_64架构是最佳的解决办法。
四、虚拟内存管理
因为操作系统将内存都映射为虚拟内存,所以操作系统的物理内存结构对用户和应用来说通常都是不可见的。如果想要理解Linux系统内存的调优,我们必须了解Linux的虚拟内存机制。应用程序并不分配物理内存,而是向Linux内核请求一部分映射为虚拟内存的内存空间。如下图所示虚拟内存并不一定是映射物理内存中的空间,如果应用程序有一个大容量的请求,也可能会被映射到在磁盘子系统中的swap空间中。
另外要提到的是,通常应用程序不直接将数据写到磁盘子系统中,而是写入缓存和缓冲区中。Bdflush守护进程将定时将缓存或者缓冲区中的数据写到硬盘上。
Linux内核处理数据写入磁盘子系统和管理磁盘缓存是紧密联系在一起的。相对于其他的操作系统都是在内存中分配指定的一部分作为磁盘缓存,Linux处理内存更加有效,默认情况下虚拟内存管理器分配所有可用内存空间作为磁盘缓存,这就是为什么有时我们观察一个配置有数G内存的Linux系统可用内存只有20MB的原因。
同时Linux使用swap空间的机制也是相当高效率的,如上图所示虚拟内存空间是由物理内存和磁盘子系统中的swap空间共同组成的。如果虚拟内存管理器发现一个已经分配完成的内存分页已经长时间没有被调用,它将把这部分内存分页移到swap空间中。经常我们会发现一些守护进程,比如getty,会随系统启动但是却很少会被应用到。这时为了释放昂贵的主内存资源,系统会将这部分内存分页移动到swap空间中。上述就是Linux使用swap空间的机制,当swap分区使用超过50%时,并不意味着物理内存的使用已经达到瓶颈了,swap空间只是Linux内核更好的使用系统资源的一种方法。
简单理解:Swap usage只表示了Linux管理内存的有效性。对识别内存瓶颈来说,Swap In/Out才是一个比较又意义的依据,如果Swap In/Out的值长期保持在每秒200到300个页面通常就表示系统可能存在内存的瓶颈。下面的事例是好的状态:
引用
# vmstat
procs ———–memory————- —swap– —–io—- –system– —-cpu—-
r b swpd free buff cache si so bi bo in cs us sy id wa
1 0 5696 6904 28192 50496 0 0 88 117 61 29 11 8 80 1
五、模块化的I/O调度器
就象我们知道的Linux2.6内核为我们带来了很多新的特性,这其中就包括了新的I/O调度机制。旧的2.4内核使用一个单一的I/O调度器,2.6 内核为我们提供了四个可选择的I/O调度器。因为Linux系统应用在很广阔的范围里,不同的应用对I/O设备和负载的要求都不相同,例如一个笔记本电脑和一个10000用户的数据库服务器对I/O的要求肯定有着很大的区别。
引用
(1).Anticipatory
anticipatory I/O调度器创建假设一个块设备只有一个物理的查找磁头(例如一个单独的SATA硬盘),正如anticipatory调度器名字一样,anticipatory调度器使用“anticipatory”的算法写入硬盘一个比较大的数据流代替写入多个随机的小的数据流,这样有可能导致写 I/O操作的一些延时。这个调度器适用于通常的一些应用,比如大部分的个人电脑。
(2).Complete Fair Queuing (CFQ)
Complete Fair Queuing(CFQ)调度器是Red Flag DC Server 5使用的标准算法。CFQ调度器使用QoS策略为系统内的所有任务分配相同的带宽。CFQ调度器适用于有大量计算进程的多用户系统。它试图避免进程被饿死和实现了比较低的延迟。
(3).Deadline
deadline调度器是使用deadline算法的轮询的调度器,提供对I/O子系统接近实时的操作,deadline调度器提供了很小的延迟和维持一个很好的磁盘吞吐量。如果使用deadline算法请确保进程资源分配不会出现问题。
(4).NOOP
NOOP调度器是一个简化的调度程序它只作最基本的合并与排序。与桌面系统的关系不是很大,主要用在一些特殊的软件与硬件环境下,这些软件与硬件一般都拥有自己的调度机制对内核支持的要求很小,这很适合一些嵌入式系统环境。作为桌面用户我们一般不会选择它。
六、网络子系统
新的网络中断缓和(NAPI)对网络子系统带来了改变,提高了大流量网络的性能。Linux内核在处理网络堆栈时,相比降低系统占用率和高吞吐量更关注可靠性和低延迟。所以在某些情况下,Linux建立一个防火墙或者文件、打印、数据库等企业级应用的性能可能会低于相同配置的Windows服务器。
在传统的处理网络封包的方式中,如下图蓝色箭头所描述的,一个以太网封包到达网卡接口后,如果MAC地址相符合会被送到网卡的缓冲区中。网卡然后将封包移到操作系统内核的网络缓冲区中并且对CPU发出一个硬中断,CPU会处理这个封包到相应的网络堆栈中,可能是一个TCP端口或者Apache应用中。
这是一个处理网络封包的简单的流程,但从中我们可以看到这个处理方式的缺点。正如我们看到的,每次适合网络封包到达网络接口都将对CPU发出一个硬中断信号,中断CPU正在处理的其他任务,导致切换动作和对CPU缓存的操作。你可能认为当只有少量的网络封包到达网卡的情况下这并不是个问题,但是千兆网络和现代的应用将带来每秒钟成千上万的网络数据,这就有可能对性能造成不良的影响。
正是因为这个情况,NAPI在处理网络通讯的时候引入了计数机制。对第一个封包,NAPI以传统的方式进行处理,但是对后面的封包,网卡引入了POLL 的轮询机制:如果一个封包在网卡DMA环的缓存中,就不再为这个封包申请新的中断,直到最后一个封包被处理或者缓冲区被耗尽。这样就有效的减少了因为过多的中断CPU对系统性能的影响。同时,NAPI通过创建可以被多处理器执行的软中断改善了系统的可扩展性。NAPI将为大量的企业级多处理器平台带来帮助,它要求一个启用NAPI的驱动程序。在今天很多驱动程序默认没有启用NAPI,这就为我们调优网络子系统的性能提供了更广阔的空间。
七、理解Linux调优参数
因为Linux是一个开源操作系统,所以又大量可用的性能监测工具。对这些工具的选择取决于你的个人喜好和对数据细节的要求。所有的性能监测工具都是按照同样的规则来工作的,所以无论你使用哪种监测工具都需要理解这些参数。下面列出了一些重要的参数,有效的理解它们是很有用处的。
(1)处理器参数
引用
・CPU utilization
这是一个很简单的参数,它直观的描述了每个CPU的利用率。在xSeries架构中,如果CPU的利用率长时间的超过80%,就可能是出现了处理器的瓶颈。
・Runable processes
这个值描述了正在准备被执行的进程,在一个持续时间里这个值不应该超过物理CPU数量的10倍,否则CPU方面就可能存在瓶颈。
・Blocked
描述了那些因为等待I/O操作结束而不能被执行的进程,Blocked可能指出你正面临I/O瓶颈。
・User time
描述了处理用户进程的百分比,包括nice time。如果User time的值很高,说明系统性能用在处理实际的工作。
・System time
描述了CPU花费在处理内核操作包括IRQ和软件中断上面的百分比。如果system time很高说明系统可能存在网络或者驱动堆栈方面的瓶颈。一个系统通常只花费很少的时间去处理内核的操作。
・Idle time
描述了CPU空闲的百分比。
・Nice time
描述了CPU花费在处理re-nicing进程的百分比。
・Context switch
系统中线程之间进行交换的数量。
・Waiting
CPU花费在等待I/O操作上的总时间,与blocked相似,一个系统不应该花费太多的时间在等待I/O操作上,否则你应该进一步检测I/O子系统是否存在瓶颈。
・Interrupts
Interrupts 值包括硬Interrupts和软Interrupts,硬Interrupts会对系统性能带来更多的不利影响。高的Interrupts值指出系统可能存在一个软件的瓶颈,可能是内核或者驱动程序。注意Interrupts值中包括CPU时钟导致的中断(现代的xServer系统每秒1000个 Interrupts值)。
(2)内存参数
引用
・Free memory
相比其他操作系统,Linux空闲内存的值不应该做为一个性能参考的重要指标,因为就像我们之前提到过的,Linux内核会分配大量没有被使用的内存作为文件系统的缓存,所以这个值通常都比较小。
・Swap usage
这 个值描述了已经被使用的swap空间。Swap usage只表示了Linux管理内存的有效性。对识别内存瓶颈来说,Swap In/Out才是一个比较又意义的依据,如果Swap In/Out的值长期保持在每秒200到300个页面通常就表示系统可能存在内存的瓶颈。
・Buffer and cache
这个值描述了为文件系统和块设备分配的缓存。在Red Flag DC Server 5版本中,你可以通过修改/proc/sys/vm中的page_cache_tuning来调整空闲内存中作为缓存的数量。
・Slabs
描述了内核使用的内存空间,注意内核的页面是不能被交换到磁盘上的。
・Active versus inactive memory
提供了关于系统内存的active内存信息,Inactive内存是被kswapd守护进程交换到磁盘上的空间。
(3)网络参数
引用
・Packets received and sent
这个参数表示了一个指定网卡接收和发送的数据包的数量。
・Bytes received and sent
这个参数表示了一个指定网卡接收和发送的数据包的字节数。
・Collisions per second
这个值提供了发生在指定网卡上的网络冲突的数量。持续的出现这个值代表在网络架构上出现了瓶颈,而不是在服务器端出现的问题。在正常配置的网络中冲突是非常少见的,除非用户的网络环境都是由hub组成。
・Packets dropped
这个值表示了被内核丢掉的数据包数量,可能是因为防火墙或者是网络缓存的缺乏。
・Overruns
Overruns表达了超出网络接口缓存的次数,这个参数应该和packets dropped值联系到一起来判断是否存在在网络缓存或者网络队列过长方面的瓶颈。
・Errors 这个值记录了标志为失败的帧的数量。这个可能由错误的网络配置或者部分网线损坏导致,在铜口千兆以太网环境中部分网线的损害是影响性能的一个重要因素。
(4)块设备参数
引用
・Iowait
CPU等待I/O操作所花费的时间。这个值持续很高通常可能是I/O瓶颈所导致的。
・Average queue length
I/O请求的数量,通常一个磁盘队列值为2到3为最佳情况,更高的值说明系统可能存在I/O瓶颈。
・Average wait
响应一个I/O操作的平均时间。Average wait包括实际I/O操作的时间和在I/O队列里等待的时间。
・Transfers per second
描述每秒执行多少次I/O操作(包括读和写)。Transfers per second的值与kBytes per second结合起来可以帮助你估计系统的平均传输块大小,这个传输块大小通常和磁盘子系统的条带化大小相符合可以获得最好的性能。
・Blocks read/write per second
这个值表达了每秒读写的blocks数量,在2.6内核中blocks是1024bytes,在早些的内核版本中blocks可以是不同的大小,从512bytes到4kb。
・Kilobytes per second read/write
按照kb为单位表示读写块设备的实际数据的数量。

⑵ 网站性能优化怎么办

一、前端优化

网站性能优化是一个很综合的话题,涉及到服务器的配置和网站前后端程序等各个方面,我只是从实际经历出发,分享一下自己所尝试过的网站性能优化方法。之所以在标题上挂一个web2.0,是因为本文更偏重于中小网站的性能优化,我所使用的系统也是典型web2.0的LAMP架构。

首先讲讲前端的优化,用户访问网页的等待时间,有80%是发生在浏览器前端,特别是页面和页面中各种元素(图片、CSS、javascript、 flash…)的下载之上。因此在很多情况下,相对于把大量的时间花在艰苦而繁杂的程序改进上,前端的优化往往能起到事半功倍的作用。雅虎最近将内部使用的性能测试工具yslow向第三方公开,并发布了着名的网站性能优化的十三条规则,建议你下载并安装yslow,并作为测评网站优化效果的工具。下面我挑其中特别有价值的具体说明一下优化的方法:

对于第一次访问您网站,尚未在浏览器cache中缓存您网站内容的用户,我们可以做的事情包括:

1)减少一个页面访问所产生的http连接次数
对于第一次访问你网站的用户,页面所产生的http连接次数是影响性能的一个关键瓶颈。

对策:
- 尽量简洁的页面设计,最大程度减少图片的使用,通过放弃一些不必要的页面特效来减少javascript的使用。
- 使用一些优化技巧,比如利用图片的背景位移减少图片的个数;image map技术;使用Inline images将css图片捆绑到网页中。
- 尽量合并js和css文件,减少独立文件个数。

2) 使用gzip压缩网页内容
使用gzip来压缩网页中的静态内容,能够显着减少用户访问网页时的等待时间(据说可达到60%)。主流的web服务器都支持或提供gzip压缩,如果使用apache服务器,只需要在配置文件中开启 mod_gzip(apache1.x)或mod_deflate(apache2.x)即可。凡是静态的页面,使用gzip压缩都能够显着提高服务器效率并减少带宽支出,注意图片内容本身已经是压缩格式了,务必不要再进行压缩。

3)将CSS放在页面顶端,JS文件放在页面底端
CSS的引用要放在html的头部header中,JS文件引用尽量放在页面底端标签的后面,主要的思路是让核心的页面内容尽早显示出来。不过要注意,一些大量使用js的页面,可能有一些js文件放在底端会引起一些难以预料的问题,根据实际情况适当运用即可。

4)使JS文件内容最小化
具体来说就是使用一些javascript压缩工具对js脚本进行压缩,去除其中的空白字符、注释,最小化变量名等。在使用gzip压缩的基础上,对js内容的压缩能够将性能再提高5%。

5)尽量减少外部脚本的使用,减少DNS查询时间
不要在网页中引用太多的外部脚本,首先,一次dns的解析过程会消耗20-120毫秒的时间;其次,如果在页面中引用太多的外部文件(如各种广告、联盟等代码),可能会因为外部文件的响应速度而将你的网站拖得很慢。如果不得不用,那么就尽量将这些脚本放在页脚吧。不过有一点需要提及,就是浏览器一般只能并行处理同一域名下的两个请求,而对于不同子的域名则不受此限制,因此适当将本站静态内容(css,js)放在其他的子域名下(如 static.xxx.com)会有利于提高浏览器并行下载网页内容的能力。

对于您网站的经常性访问用户,主要的优化思路就是最大限度利用用户浏览器的cache来减少服务器的开销。

1)在header中添加过期时间(Expires Header)
在header中给静态内容添加一个较长的过期时间,这样可以使用户今后访问只读取缓存中的文件,而不会与服务器产生任何的交互。不过这样做也存在一些问题,当图片、CSS和js文件更新时,用户如果不刷新浏览器,就无法获得此更新。这样,我们在对图片、css和js文件修改时,必须要进行重命名,才能保证用户访问到最新的内容。这可能会给开发造成不小的麻烦,因为这些文件可能被站点中的许多文件所引用。flickr提出的解决办法是通过url rewrite使不同版本号的URL事实上指向同一个文件,这是一个聪明的办法,因为url级别的操作效率是很高的,可以给开发过程提供不少便利。

要理解为什么这样做,必须要了解浏览器访问url时的工作机制:
a. 第一次访问url时,用户从服务器段获取页面内容,并把相关的文件(images,css,js…)放在高速缓存中,也会把文件头中的expired time,last modified, ETags等相关信息也一同保留下来。
b. 用户重复访问url时,浏览器首先看高速缓存中是否有本站同名的文件,如果有,则检查文件的过期时间;如果尚未过期,则直接从缓存中读取文件,不再访问服务器。
c. 如果缓存中文件的过期时间不存在或已超出,则浏览器会访问服务器获取文件的头信息,检查last modifed和ETags等信息,如果发现本地缓存中的文件在上次访问后没被修改,则使用本地缓存中的文件;如果修改过,则从服务器上获取最新版本。

我的经验,如果可能,尽量遵循此原则给静态文件添加过期时间,这样可以大幅度减少用户对服务器资源的重复访问。

2)将css和js文件放在独立外部文件中引用
将css和js文件放在独立文件中,这样它们会被单独缓存起来,在访问其他页面时可以从浏览器的高速缓存中直接读取。一些网站的首页可能是例外的,这些首页的自身浏览可能并不大,但却是用户访问网站的第一印象以及导向到其他页面的起点,也可能这些页面本身使用了大量的ajax局部刷新及技术,这时可以将 css和js文件直接写在页面中。

3)去掉重复的脚本
在IE中,包含重复的js脚本会导致浏览器的缓存不被使用,仔细检查一下你的程序,去掉重复引用的脚本应该不是一件很难的事情。

4)避免重定向的发生
除了在header中人为的重定向之外,网页重定向常在不经意间发生,被重定向的内容将不会使用浏览器的缓存。比如用户在访问www.xxx.com,服务器会通过301转向到www.xxx.com/,在后面加了一个“/”。如果服务器的配置不好,这也会给服务器带来额外的负担。通过配置apache的 alias或使用mod_rewrite模块等方法,可以避免不必要的重定向。

还有一些,比如使用CDN分发机制、避免CSS表达式等、避免使用ETags等,因为不太常用,这里就不再赘述了。

做完了上述的优化,可以试着用yslow测试一下网页的性能评分,一般都可以达到70分以上了。

当然,除了浏览器前端和静态内容的优化之外,还有针对程序脚本、服务器、数据库、负载的优化,这些更深层次的优化方法对技术有更高的要求。本文的后半部分将重点探讨后端的优化。

二、后端优化

上次写完web2.0网站前端优化篇之后,一直想写写后端优化的方法,今天终于有时间将思路整理了出来。

前端优化可以避免我们造成无谓的服务器和带宽资源浪费,但随着网站访问量的增加,仅靠前端优化已经不能解决所有问题了,后端软件处理并行请求的能力、程序运 行的效率、硬件性能以及系统的可扩展性,将成为影响网站性能和稳定的关键瓶颈所在。优化系统和程序的性能可以从以下的方面来入手:

1)apache、mysql等软件的配置的优化
尽管apache和mysql等软件在安装后使用的默认设置足以使你的网站运行起来,但是通过调整mysql和apache的一些系统参数,还是可以追求更高的效率和稳定性。这个领域中有很多专业的文章和论坛(比如: http://www.mysqlperformanceblog.com/),要想掌握也需要进行深入的研究和实践,这里就不重点讨论了。

2)应用程序环境加速
这里仅以我最常应用的php开发环境为例,有一些工具软件可以通过优化PHP运行环境来达到提速的目的,其基本原理大致是将PHP代码预编译并缓存起来,而不需要改变任何代码,所以比较简单,可以将php的运行效率提升50%以上。比较常用的免费php加速工具有:APC( http: //pecl.php.net/package-info.php?package=APC)、Turck MMCache( http://turck-mmcache.sourceforge.net)、php accelebrator(www.php-accelerator.co.uk),还有收费的Zend Performance Suite

3)将静态内容和动态内容分开处理
apache是一个功能完善但比较庞大的web server,它的资源占用基本上和同时运行的进程数呈正比,对服务器内存的消耗比较大,处理并行任务的效率也一般。在一些情况下,我们可以用比较轻量级的web server来host静态的图片、样式表和javascript文件,这样可以大大提升静态文件的处理速度,还可以减少对内存占用。我使用的web server是来自俄罗斯的nginx,其他选择方案还包括lighttpd和thttpd等。

4)基于反向代理的前端访问负载均衡
当一台前端服务器不足以应付用户访问时,通过前端机实现web访问的负载均衡是最快速可行的方案。通过apache的mod_proxy可以实现基于反向代理的负载均衡,这里推荐使用nginx做代理服务器,处理速度较apache更快一些。

5)应用缓存技术提高数据库效能,文件缓存和分布式缓存
数据库访问处理并发访问的能力是很多网站应用的关键瓶颈,在想到使用主从结构和多farm的方式构建服务器集群之前,首先应该确保充分使用了数据库查询的缓存。一些数据库类型(如mysql的innoDB)自身内置对缓存的支持,此外,还可以利用程序方法将常用的查询通过文件或内存缓存起来。比如通过 php中的ob_start和文件读写函数可以很方便的实现文件形式的缓存,而如果你拥有多台服务器,可以通过memcache技术通过分布式共享内存来对数据库查询进行缓存,不仅效率高而且扩展性好,memcache技术在livejournal和Craigslist.org等知名网站应用中都得到了检验。

6)服务器运行状态的检测,找到影响性能的瓶颈所在
系统优化没有一劳永逸的方法,需要通过检测服务器的运行状态来及时发现影响性能的瓶颈,以及可能存在的潜在问题,因为网站的性能,永远取决于木桶中的短板。可以编写一些脚本来检测web服务的运行,也有一些开源的软件也提供了很好的功能

7)良好的扩展架构是稳定和性能的基础
一些技巧和窍门可以帮你度过眼前的难关,但要想使网站具备应付大规模访问的能力,则需要从系统架构上进行彻底的规划,好在很多前人无私的把他们架构
网站的经验分享给我们,使我们可以少走甚多弯路。我最近读到的两篇有启发的文章:
- 从LiveJournal后台发展看大规模网站性能优化方法
- Myspace的六次重构

最后不得不提到程序编码和数据库结构对性能的影响,一系列糟糕的循环语句,一个不合理的查询语句、一张设计不佳的数据表或索引表,都足以会使应用程序运行的速度成倍的降低。培养全局思考的能力,养成良好的编程习惯,并对数据库运行机制有所了解,是提高编程质量的基础。

⑶ Windows Server服务器网络性能优化

TcpTimedWaitDelay :确定 TCP/IP 可释放已关闭连接并重用其资源前,必须经过的时间。关闭和释放之间的此时间间隔通称 TIME_WAIT 状态或两倍最大段生命周期(2MSL)状态。此时间期间,重新打开到客户机和服务器的连接的成本少于建立新连接。减少此条目的值允许 TCP/IP 更快地释放已关闭的连接,为新连接提供更多资源。如果运行的应用程序需要快速释放和创建新连接,而且由于 TIME_WAIT 中存在很多连接,导致低吞吐量,则调整此参数。

MaxUserPort :确定在应用程序从系统请求可用用户端口时,TCP/IP 可指定的最高端口号。 如何查看或设置: 使用 regedit 命令访问 HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/ Services/TCPIP/Parameters 注册表子键并创建名为 MaxUserPort 的新 REG_DWORD 值。 停止并重新启动系统。 缺省值:无 建议值:至少十进制 32768。 注:现在 Windows NT 或 Windows 2000 操作系统上调整 WebSphere Application Server 时,同时使用这两个参数。

将以下代码,保存为reg文件,在服务器上双击导入注册表即可。

⑷ 如何提高高性能服务器并发量

消除瓶颈是提高服务器性能和并发能力的唯一途径。 如果你能够消除所有的瓶颈,你就能够最大的发挥硬件性能,让系统的性能和并发数到达最佳。 采用多线程多核编程,使用事件驱动或异步消息机制,尽量减少阻塞和等待操作(如I/O阻塞、同步等待或计时/超时等)。 原理: 1、多线程多核编程,消除cpu瓶颈。 2、采用IOCP或epoll,利用状态监测和通知方式,消除网络I/O阻塞瓶颈。 3、采用事件驱动或异步消息机制,可以消除不必要的等待操作。 4、如果是Linux,可以采用AIO来消除磁盘I/O阻塞瓶颈。 5、在事件驱动框架或异步消息中统一处理timer事件,变同步为异步,而且可以在一个线程处理无数timer事件。 6、深入分析外部的阻塞来源,消除它。 比如数据库查询较慢,导致服务器处理较慢,并发数上不去,这时就要优化数据库性能。 7、如果与某个其他server通信量很大,导致性能下降较多。 可以考虑把这两个server放在一个主机上,采用共享内存的方式来做IPC通信,可以大大提高性能。

⑸ 高性能计算的优化

高性能计算(HighPerformanceComputing)是计算机科学的一个分支,主要是指从体系结构、并行算法和软件开发等方面研究开发高性能计算机的技术。
随着计算机技术的飞速发展,高性能计算机的计算速度不断提高,其标准也处在不断变化之中。
高性能计算简单来说就是在16台甚至更多的服务器上完成某些类型的技术工作负载。到底这个数量是需要8台,12台还是16台服务器这并不重要。在定义下假设每一台服务器都在运行自己独立的操作系统,与其关联的输入/输出基础构造都是建立在COTS系统之上。
简而言之,讨论的就是Linux高性能计算集群。
一个拥有20000台服务器的信息中心要进行分子动力学模拟无疑是毫无问题的,就好比一个小型工程公司在它的机房里运行计算流体动力学(CFD)模拟。解决工作负载的唯一限制来自于技术层面。接下来我们要讨论的问题是什么能直接加以应用。
量度(Metrics)
性能(Performance),每瓦特性能(Performance/Watt),每平方英尺性能(Performance/Squarefoot)和性能价格比(Performance/dollar)等,对于提及的20000台服务器的动力分子簇来说,原因是显而易见的。运行这样的系统经常被服务器的能量消耗(瓦特)和体积(平方英尺)所局限。这两个要素都被计入总体拥有成本(TCO)之列。在总体拥有成本(TCO)方面取得更大的经济效益是大家非常关注的。
议题的范围限定在性能方面来帮助大家理解性能能耗,性能密度和总体拥有成本(TCO)在实践中的重要性。
性能的定义
在这里把性能定义为一种计算率。例如每天完成的工作负载,每秒钟浮点运算的速度(FLOPs)等等。接下来要思考的是既定工作量的完成时间。这两者是直接关联的,速度=1/(时间/工作量)。因此性能是根据运行的工作量来进行测算的,通过计算其完成时间来转化成所需要的速度。
定量与定性
从定性的层面上来说这个问题很容易回答,就是更快的处理器,更多容量的内存,表现更佳的网络和磁盘输入/输出子系统。但当要在决定是否购买Linu集群时这样的回答就不够准确了。
对Linux高性能计算集群的性能进行量化分析。
为此介绍部分量化模型和方法技巧,它们能非常精确的对大家的业务决策进行指导,同时又非常简单实用。举例来说,这些业务决策涉及的方面包括:
购买---系统元件选购指南来获取最佳性能或者最经济的性能配置---鉴别系统及应用软件中的瓶颈
计划---突出性能的关联性和局限性来制定中期商业计划
Linux高性能计算集群模型包括四类主要的硬件组成部分。
(1)执行技术工作负载的计算节点或者服务器;
(2)一个用于集群管理,工作控制等方面的主节点;
(3)互相连接的电缆和高度普及的千兆以太网(GBE);
(4)一些全局存储系统,像由主节点输出的NFS文件一样简单易用。
高性能计算机的衡量标准主要以计算速度(尤其是浮点运算速度)作为标准。高性能计算机是信息领域的前沿高技术,在保障国家安全、推动国防科技进步、促进尖端武器发展方面具有直接推动作用,是衡量一个国家综合实力的重要标志之一。
随着信息化社会的飞速发展,人类对信息处理能力的要求越来越高,不仅石油勘探、气象预报、航天国防、科学研究等需求高性能计算机,而金融、政府信息化、教育、企业、网络游戏等更广泛的领域对高性能计算的需求迅猛增长。
一个简单量化的运用模型
这样一个量化的运用模型非常直观。在一个集群上对既定的工作完成的时间大约等同于在独立的子系统上花费的时间:
e
1、时间(Time)=节点时间(Tnode)+电缆时间(Tfabric)+存储时间(Tstorage)
Time = Tnode + Tfabric + Tstorag
这里所说的时间(Time)指的是执行工作量的完成时间,节点时间(Tnode)是指在计算节点上花费的完成时间,电缆时间(Tfabric)是指在互联网上各个节点进行互联的完成时间,而存储时间(Tstorage)则是指访问局域网或全球存储系统的完成时间。
计算节点的完成时间大约等同于在独立的子系统上花费的时间:
2、节点时间(Tnode)=内核时间(Tcore) +内存时间(Tmemory)
这里所说的内核时间(Tcore)指的是在微处理器计算节点上的完成时间。而内存时间(Tmemory)就是指访问主存储器的完成时间。这个模型对于单个的CPU计算节点来说是非常实用的,而且能很容易的扩展到通用双插槽(SMP对称多处理)计算节点。为了使第二套模型更加实用,子系统的完成时间也必须和计算节点的物理配置参数相关联,例如处理器的速度,内存的速度等等。
计算节点
图示中的计算节点原型来认识相关的配置参数。图示上端的是2个处理器插槽,通过前端总线(FSB-front side bus)与内存控制中心(MCH)相连。这个内存控制中心(MCH)有四个存储信道。同时还有一个Infiniband HCA通过信道点对点串行(PCIe)连接在一起。
像千兆以太网和串行接口(SATA)硬盘之类的低速的输入输出系统都是通过芯片组中的南桥通道(South Bridge)相连接的。在图示中,大家可以看到每个主要部件旁边都用红色标注了一个性能相关参数。这些参数详细的说明了影响性能(并非全部)的硬件的特性。它们通常也和硬件的成本直接相关。举例来说,处理器时钟频率(fcore)在多数工作负荷状态下对性能影响巨大。根据供求交叉半导体产额曲线原理,处理器速度越快,相应成本也会更高。
高速缓存存储器的体积也会对性能产生影响,它能减少主频所承载的工作负荷以提高其运算速度。处理器内核的数量(Ncores)同样会影响性能和成本。内存子系统的速度可以根据双列直插内存模块频率(fDIMM)和总线频率(fBus)进行参数化,它在工作负荷状态下也对性能产生影响。同样,电缆相互连接(interconnect fabric)的速度取决于信道点对点串行的频率。
而其他一些因素,比如双列直插内存模块内存延迟(DIMM CAS Latency),存储信道的数量等都做为次要因素暂时忽略不计。
使用的性能参数
在图示中标明的6个性能参数中,保留四个和模型相关的参数。
首先忽略信道点对点串行的频率(fPCIe),因为它主要影响的是电缆相互连接(interconnect fabric)速度的性能,这不在范围之列。
接下来注意一下双列直插内存模块频率(fDIMM)和总线频率(fBus)会由于内存控制中心(MCH)而限于固定比率。
使用的双核系统中,这些比率最具代表性的是4:5, 1:1, 5:4。一般情况下只会用到其中的一个。高速缓存存储器的体积非常重要。
在这个模型中保留这个参数。内核的数量(Ncores)和内核频率(fcore)也非常重要,保留这两个参数。
高性能计算(HPC)模型
这第二个模型的基本形式在计算机体系研究领域已经存在了很多年。
A普通模式是:
(3) CPI = CPI0 + MPI * PPM
这里的CPI指的是处理器在工作负荷状态下每执行一个指令的周期。CPI0是指内核CPI,MPI I则是指在工作负荷状态下高速缓存存储器每个指令失误的次数(注释:在高性能计算领域,MPI主要用于信息传递界面,在此处主要是指处理器构造惯例),PPM是指以处理器时钟滴答声为单位对高速缓存存储器每个指令失误的次数的记录。第二和第三个方程式相互吻合。这第一个术语代表的是处理器,第二个术语代表的是内存。
可以直观的看到,假设每项工作下执行的P指令的工作负荷与代表处理器的频率的内核频率(每秒钟处理器运行周期的单位)再与方程式(3)相乘,就得到了方程式(4):
Tnode = (CPIo * P) * (1 / fcore) + (MPI * P) * PPM * (1 / fcore)
在这里要注意(CPIo * P)是以每项工作分配下处理器的运行周期为单位,对微处理器架构上运行的既定工作负荷通常是个恒量。因此把它命名为α。(处理器周期本身无法对时间进行测算,如果乘以内核的频率就可以得到时间的测算标准。因此Tnode在方程式(4)的右边)。
(MPI * P)也是同理。对于既定工作负荷和体系结构来说它也是个恒量,但它主要依赖于高速缓存存储器的体积。我们把它命名为M(MBcache)。而PPM是指访问主存的成本。对于既定的工作负荷来说,通常是个固定的数字C。PPM乘以内存频率和总线频率的比值(fcore / fBus)就从总线周期(bus cycles)转化成了处理器周期。因此PM = C * fcore / fBus。套入M(MBcache)就可以得到:
(5) Tnode = α * (1 / fcore) + M(MBcache) * (1 / fbus)
这个例子说明总线频率(bus frequency)也是个恒量,方程式(5)可以简化为方程式(6):
(6) Tnode = α * (1 / fcore) + β
在这里Tcore = α * (1 / fcore),而Tmemory = β(也就是公式2里的术语。我们把这些关键点关联在一起)。
首先在模型2里,公式5和公式6都有坚实的理论基础,因为经分析过它是如何从公式3推理而来(它主要应用于计算机体系理论)。其次,这个模型4个硬件性能参数的3个已经包括其中。还差一个参数就是内核数量(Ncores)。
用直观的方式来说明内核的数量,就是假设把N个内核看做是一个网络频率上运行的一个内核,称之为N*fcore。那么根据公式(6)我们大致可以推算出:
(7) Tcore ~ α / (N*fcore)
Tcore~ ( α / N) * (1 / fcore )
也可以把它写成:
(8) αN = ( α / N)
多核处理器的第一个字母Alpha可能是单核处理器的1/N次。
通过数学推算这几乎是完全可能的。
通常情况下我们是根据系统内核和总线频率(bus frequencies)来衡量计算机系统性能,如公式(5)所阐述的。但是公式(5)的左边是时间单位--这个时间单位指的是一项工作量的完成时间。这样就能更清楚的以时间为单位说明右侧的主系统参数。同时请注意内核的时钟周期τcore(是指每次内核运行周期所需的时间)也等同于(1 / fcore)。总线时钟(bus clock)周期也是同理。
(9) Tnode = αN * τcore + M(MBcache) * τBus
这个公式的转化也给了一个完成时间的模型,那就是2个基本的自变量τcore和τBus呈现出直线性变化。这对使用一个简单的棋盘式对照表对真实系统数据进行分析是有帮助的。

⑹ 生产级基于SpringCloud微服务架构性能优化实战,建议收藏

本文将从 Tomcat性能优化,SpringCloud开启重试机制,Zuul网关性能参数优化,Ribbon性能参数优化,Feign与Hystrix性能优化等 五个方面分享在生产环境如何做好SpringCloud性能优化。

一般基于SpringCloud的微服务能够脱离传统的tomcat,独立跑起来,SpringBoot功不可没,其原理是SpringBoot内嵌了tomcat(当然可以换成其他servlet容器,如jetty),能够以java -jar形式就能跑起来。

所以针对每个springboot服务,我们需要对tomcat的一些参数进行优化,以下是楼主项目组优化的tomcat参数配置,供大家参考。

tomcat参数说明:

maxThreads,acceptCount参数应用场景

场景一

场景二

场景三

maxThreads调优

一般说服务器性能要从两个方面说起:

1、cpu计算型指标

2、io密集型指标

所以大部分情况下,tomcat处理io型请求比较多,比如常见的连数据库查询数据进行接口调用。

另外,要考虑tomcat的并发请求量大的情况下,对于服务器系统参数优化,如虚拟机内存设置和linux的open file限制。

maxThreads设置多大合适?

我们知道线程过多,会导致cpu在线程切换时消耗的时间随着线程数量的增加越来越大;线程太少,服务器的请求响应吞吐量会急剧下降,所以maxThreads的配置绝对不是越大越好。

实际情况是设置maxThreads大小没有最优解,要根据具体的服务器配置,实际的应用场景不断的调整和优化。

acceptCount设置多大合适?

尽量与maxThreads的大小保持一致 这个值应该是主要根据应用的访问峰值与平均值来权衡配置的。

当使用URL进行路由时,则需要对zuul.host.connect-timeout-millis和zuul.host.socket-timeout-millis参数控制超时时间。

请求连接的超时时间

请求处理的超时时间

对所有操作请求都进行重试

对当前实例的重试次数,针对同一个服务实例,最大重试次数(不包括首次调用)

对下个实例的重试次数,针同其它的服务实例,最大重试次数(不包括首次server)

注意Hystrix断路器的超时时间需要大于ribbon的超时时间,不然不会触发重试

Feign和Ribbon在整合了Hystrix后,首次调用失败的问题?

目前楼主的强烈做法是: 禁用Hystrix的超时时间,设为false

还有一种是官方提倡的是 设置超时时间。

在实际的项目中亲测,这种方式也有不好的地方, 如请求时间超过5s会出现请求数据时有时无的情况 ,给用户的感觉是 系统不稳定,要求整改

另外,禁用hystrix,官方不推荐

hystrix超时设置原则

问题:一个http请求,如果feign和ribbon都配置了重试机制,异常情况下一共会请求多少次?

请求总次数 n 为feignClient和ribbon配置参数的笛卡尔积:

n(请求总次数) = feign(默认5次) * (MaxAutoRetries+1) * (MaxAutoRetriesNextServer+1)

其中+1是代表ribbon本身默认的请求。

其实二者的重试机制相互独立,并无联系。但是因为用了feign肯定会用到ribbon,所以feign的重试机制相对来说比较鸡肋,一般会关闭该功能。ribbon的重试机制默认配置为0,也就是默认是去除重试机制的,建议不要修改。

阅读全文

与服务性能算法优化相关的资料

热点内容
业余编程语言哪个好学 浏览:131
按照文件夹分个压缩 浏览:102
航空工业出版社单片机原理及应用 浏览:756
如何在电信app上绑定亲情号 浏览:374
安卓的怎么用原相机拍月亮 浏览:803
配音秀为什么显示服务器去配音了 浏览:755
c盘清理压缩旧文件 浏览:325
app怎么交付 浏览:343
图虫app怎么才能转到金币 浏览:175
如何做征文app 浏览:446
用什么app管理斐讯 浏览:169
安卓如何下载宝可梦剑盾 浏览:166
编译器开发属于哪个方向 浏览:940
megawin单片机 浏览:687
以色列加密货币监督 浏览:909
程序员前端现在怎么样 浏览:499
服务器和接口地址ping不通 浏览:557
linux命令返回上级目录 浏览:899
移动花卡宝藏版为什么不能选免流app 浏览:257
速腾carplay怎么用安卓 浏览:13