应用服务器就是处理网站业务的服务器,网站的业务代码都部署在这里,是网站开发最复杂,变化最多的地方,优化手段主要有缓存、集群、异步等。下面来了解一下!
通常服务器的性能会卡在三个地方:
cpu
网络IO
磁盘IO
一、合理配置虚拟内存
虚拟内存对服务器性能的影响很大。简单的说,虚拟内存(虚拟化)是物理内存的补充。服务器操作系统在运行过程中,如果内存不够的话,就会先将内存中不用的数据(数据中心)保存在虚拟内存中。当虚拟内存不足时,操作系统就会报虚拟内存不足的错误,同时应用程序的性能会有明显的下降。总之,合理配置虚拟内存是提升Windows服务器性能很重要的一个方面。通常情况下,如果要合理配置虚拟内存的话,要同时兼顾到物理内存的容量、所采用的信息化系统以及虚拟内存的位置。
物理内存的容量是配置虚拟内存的基础。一般来说,建议虚拟内存的容量是物理内存的1倍左右。如物理内存如果是4G的话,那么虚拟内存最好是8G。至少不能够少于4G。不过这也不是绝对的。有时候会根据所采用的信息化系统的不同,而有一个上下浮动的过程。
第二个需要考虑的是所采取的信息化应用。笔者认为,这也是在配置虚拟内存时需要考虑的最关键的一个方面。有些信息化系统对于内存的要求比较大。此时光靠物理内存可能无法满足用户的需要,此时就需要借助虚拟内存。如笔者以前接触到一个BI系统。这个系统采用了比较先进的内存压缩技术。简单的说就是在内存中创建数据仓库,以提高读取的效率。在这种情况下,就对内存的容量有比较高的要求。对于这些系统的话,虚拟内存要设置的要一点。而对于其他一些信息化应用,如即时通信服务器、身份验证服务器等等,则虚拟内存就可以设置的低一些。
第三个需要考虑的因素是虚拟内存的位置。其实虚拟内存就是硬盘上划分的一块固定的空间。现在需要考虑的是,应该将虚拟内存放置在硬盘上的哪一块地方呢?笔者的建议是,最好将虚拟内存存放在系统分区上。当然前提是系统分区有足够多的磁盘空间。同时,这个分区所在的硬盘最好是性能比较好的,以提高数据读取的效率。如果将虚拟内存防止在其他非系统盘上,往往是一个不理智的做法。虽然其不会影响到系统的正常使用,但是会对服务器的性能带来很大的不利影响。
总之,在配置虚拟内存时,主要从以上三个方面着手。通常情况下配置虚拟内存不会有很大的问题。
二、为操作系统分区保留足够的空间
当操作系统分区的空间不足时,会使得服务器操作系统的性能下降,甚至可能导致服务器崩溃。在服务器部署时,最好为操作系统分区保留足够的空间。具体的说,需要考虑如下几个方面的因素。
提高CPU性能的方法
并发。利用多线程、进程。老的线程库效率太低,需要升级用nptl 。进(线)程数不要大于cpu个数 谨慎用锁。改善架构,尽量不用锁。
慎用字符串操作,比如sprintf,snprintf,因为%d %s等等都需要CPU资源去做词法分析,数量多的话,也是不菲的开销
减少系统调用,例如time,主要消耗在用户态和内核态之间的切换。
减少遍历操作。
把握真实需求,简化实现方案
优化架构,字符串协议解包很耗cpu,考虑单独一个线程
一个好的架构,服务器的CPU总消耗总是平均的分布在各个cpu上,CPU的消耗在70%左右
提高网络IO的方法
Linux可以利用空闲内存作文件系统访问的cache,因此系统内存越大存储系统的性能也越好;利用顺序写,减少寻道次数;Cache策略,充分利用cpu和内存的资源来缓解磁盘读写压力
使用epoll代替select
使用非阻塞的模式来开发
1、提高CPU性能的方法
并发。利用多线程、进程。老的线程库效率太低,需要升级用nptl 。进(线)程数不要大于cpu个数
谨慎用锁。改善架构,尽量不用锁。
慎用字符串操作,比如sprintf,snprintf,因为%d %s等等都需要CPU资源去做词法分析,数量多的话,也是不菲的开销
减少系统调用,例如time,主要消耗在用户态和内核态之间的切换。
减少遍历操作。
把握真实需求,简化实现方案
优化架构,字符串协议解包很耗cpu,考虑单独一个线程
一个好的架构,服务器的CPU总消耗总是平均的分布在各个cpu上,CPU的消耗在70%左右
2、提高网络IO的方法
使用epoll代替select
使用非阻塞的模式来开发
一是考虑到虚拟内存的需要。在上面的内容中笔者谈到过,最好能够将虚拟内存保存在操作系统的分区上,以提高性能。在后续工作中,可能需要部署新的信息化系统。此时就可能需要增加虚拟内存的容量。如果操作系统分区不足的情况下,那么就需要调整系统分区的大小。而这个操作是比较麻烦的,而且风险也比较大。
二是要考虑到临时文件的需要。在应用软件或者操作系统升级时,或者出于其他的需要,往往会用大比较多的临时文件。通常情况下,这些临时文件时保存在操作系统的分区上。当临时文件比较多时,就需要操作系统分区比较大的空间。故在部署服务器时,要预先评估临时文件的大小,特别是要考虑以后系统升级时的情况。如果所需要的空间实在太大,那么可以考虑将临时文件保存在非操作系统分区上。毕竟临时文件可能只是偶尔要用到。将其放置在非系统分区上,对于性能的影响,也是比较小的。
三、利用磁盘阵列解决I/O瓶颈
有些信息化系统比较变态,其数据读取与存入量非常的大。如文件服务器系统、视频监控系统。这些系统虽然其本身并不复杂,对于系统的硬件要求也不高。但是往往对于存储设备的性能有比较高的要求。其性能的瓶颈主要是处在磁盘的I/O上面。做一个形象的比喻,就是车太多、道路太窄。为此就出现了早高峰、晚高峰的堵车现象。
在Windows服务器操作系统中,可以通过磁盘阵列技术来解决这个问题。在Windows操作系统里,能够支持创建的磁盘阵列技术,如RAID5等等,而不需要第三方插件的支持。这也在很大程度上方便了我们对服务器进行性能的优化。笔者建议,系统管理员应该不时的检测服务器存储上的I/O情况。如果发现冲突比较严重的话,那么就需要及时的采用磁盘阵列技术来减少这种冲突。
四、三、如何来寻找系统的瓶颈呢?可以利用下面的工具:
1、top
可以查看系统中运行的进程的状况,CPU使用状况,系统负载,内存使用等。它是检查系统进程运行状况最方便的工具了,它默认显示部分活动的进程,并且按照进程使用CPU的多少排序。它可以显示全部CPU的使用状况,也可以显示每个进程都运行在那个CPU上面。
主要可以用top来看哪些进程或者那类进程占用CPU和内存资源最多,以此迅速定位存在性能问题的进程,以及运行异常的进程
2、free
free命令显示系统内存的使用状况(物理内存和交换内存)通过这个命令我们可以看到系统进程实际使用的物理内存,buffer和cache使用的物理内存
3、vmstat
vmstat是一个很全面的性能分析工具,可以观察到系统的进程状态、内存使用、虚拟内存使用、磁盘的IO、中断、上下问切换、CPU使用等。
五、及时卸载不需要的服务
在服务器操作系统安装时(默认安装),安装进程往往会自动安装不少的服务。而这些服务不少是在实际工作中用不到的内容。如在安装Windows服务器时,系统会自动安装DHCP服务、Telnet服务等等。这些服务跟大部分的信息化系统没有直接的关联。通常情况下,没有运行的必要。所以相对来说,就成为了垃圾。
笔者建议,如果系统管理员具有比较雄厚的专业知识,那么在部署服务器操作系统时,最好选择自定义安装。只选择必需的服务进行安装。如果担心自定义安装出问题,那么在操作系统部署完毕之后,最好能够仔细清理一下操作系统所安装的服务。将那些不需要的服务及时的卸载掉。而且这项工作必须要持续的坚持下去。因为在以后的工作中,可能会在无意之中安装了某些服务。定时的检查,能够及时的发现这些不需要的服务,并进行及时的清理。
五、合理使用缓存
不合理使用缓存非但不能提高系统的性能,还会成为系统的累赘,甚至风险。
频繁修改的数据
如果缓存中保存的是频繁修改的数据,就会出现数据写入缓存后,应用还来不及读取缓存,数据就已经失效,徒增系统负担。一般来说,数据的读写比在2:1(写入一次缓存,在数据更新前至少读取两次)以上,缓存才有意义。
没有热点的访问
如果应用系统访问数据没有热点,不遵循二八定律,那么缓存就没有意义。
数据不一致与脏读
一般会对缓存的数据设置失效时间,一旦超过失效时间,就要从数据库中重新加载。因此要容忍一定时间的数据不一致,如卖家已经编辑了商品属性,但是需要过一段时间才能被买家看到。还有一种策略是数据更新立即更新缓存,不过这也会带来更多系统开销和事务一致性问题。
缓存可用性
缓存会承担大部分数据库访问压力,数据库已经习惯了有缓存的日子,所以当缓存服务崩溃时,数据库会因为完全不能承受如此大压力而宕机,导致网站不可用。这种情况被称作缓存雪崩,发生这种故障,甚至不能简单地重启缓存服务器和数据库服务器来恢复。
实践中,有的网站通过缓存热备份等手段提高缓存可用性:当某台缓存服务器宕机时,将缓存访问切换到热备服务器上。但这种设计有违缓存的初衷,缓存根本就不应该当做一个可靠的数据源来使用。
通过分布式缓存服务器集群,将缓存数据分布到集群多台服务器上可在一定程度上改善缓存的可用性。当一台缓存服务器宕机时,只有部分缓存数据丢失,重新从数据库加载这部分数据不会产生很大的影响。
缓存预热(warm up)
缓存中存放的是热点数据,热点数据又是缓存系统利用LRU(最近最久未用算法)对不断访问的数据筛选淘汰出来,这个过程需要花费较长的时间。新系统的缓存系统如果没有任何数据,在重建缓存数据的过程中,系统的性能和数据库负载都不太好,那么最好在缓存系统启动时就把热点数据加载好,这个缓存预加载手段叫缓存预热。对于一些元数据如城市地名列表、类目信息,可以在启动时加载数据库中全部数据到缓存进行预热。
缓存穿透
如果因为不恰当的业务、或者恶意攻击持续高并发地请求某个不存在的数据,由于缓存没有保存该数据,所有的请求都会落到数据库上,会对数据库造成压力,甚至崩溃。一个简单的对策是将不存在的数据也缓存起来(其value为null)。
七、保持服务器操作系统的干净
在日常工作中我们往往会有这样的感受。将办公室整理的干干净净、有条理。需要用的东西不用费时间去寻找。这可以提高我们的办公效率。很多企业推行5S也是出于这方面的考虑。其实在服务器操作系统中也存在这种现象。我们自己也有这方面切身的体会。一个操作系统刚安装完毕后,性能比较好。但是等到运行个一到两年之后(没有安装新的信息化应用),如果维护不当的话,其性能可能会直线下降。这其中很大的一个原因,就是服务器操作系统没有以前那么干净了。为了优化服务器操作系统的性能,要保证操作系统的干净。
如一些不需要安装的插件,最好不要安装。有些管理员在日常工作中可能需要使用服务器操作系统进行上网。而为了IE浏览器能够显示全部的功能,有些网站往往要求IE浏览器安装一些插件。如Flash播放器、身份验证工具等等。而这些插件往往对于信息化系统的正常运作没有直接的关系。反而可能会因为这些插件的存在,而给操作系统的运行带来负面的影响。特别是Flash播放器的稳定性不是很好,有时候会占用过多的系统资源。
要保持服务器操作系统的干净。如在日常工作中,不要在服务器操作系统上进行不必要的操作。包括测试、浏览网页等等。通常情况下,如果服务器操作系统占有污点的话,就很难再清洗干净。就好像水一样,越洗越脏。
以上的招数只是针对大多数,大家都了解到了吗!更多内容就在编程学习网哟~