【Zanuck 镇】lnmp单机环境最佳性能优化

lnmp环境,站长们最熟悉了。(Linux+Nginx+Mysql+PHP)

抛弃了笨重的apache和windows,lnmp在虚拟云主机上大放异彩。废话不多说,正文开始。


整体环境的性能优化要从各个细小的方面入手,我们将按照硬件、Linux、Mysql、Nginx、PHP的顺序来依次进行细小的性能优化测试。

一、硬件

既然是单机环境,那需求就不是非常的明确,但是以小镇的经验来看,web应用的瓶颈多出现在数据库的io负载上。

  • 硬盘SSD是必不可少的,小镇觉得机械硬盘只适合用来存储一些日志文件和冷备份文件。mysql的高频率读写依赖的是硬盘的高iops,而机械硬盘根本没有iops可言,就算做raid也不如ssd来的高。(ssd应该购买企业级的,最好是大op的emlc ssd,因为ssd的寿命是个问题,不理解的我就安利下intel的dc系列,有钱的上intel p3700,没钱的你用三星的850pro也可以,千万别图便宜用tlc的硬盘,数据库这种应用分分钟把tlc的ssd寿命用完)

  • CPU正常8核以上即可,没必要太多,php计算量远不如想象的大,如果php计算量太大,应当在代码层级做相应的优化。(用laravel这种框架或者是wordpress的,应该cpu好点,性能要求较高,个人推荐Xeon E5-2650 v4)

  • 内存可以说是重中之重了,为了提高速度,我们需要做各种数据的缓存,16G的内存容量是最低界限了,但是在有ssd的情况下,造成swap而损失的性能不如想象中的恐怖,如果你的内存买不起16g的,8g也可以满足需求。

  • 网卡请最少使用千兆的,并保证网络设备不能拖后腿(小镇不熟悉网络设备,大家需要请教别的老司机)。


二、Linux

Linux依旧选择服务器最常用的发行版本Centos,centos相比于其他的linux发行版本有很多的优势,首先他非常的稳定,并且redhat会给每个版本的centos提供10年的安全更新支持。其次,centos对于安装软件的操作十分友好,可以利用yum完成常用软件的安装。

一般来说越新的centos性能越强劲,功能越丰富,这里我们选择centos7.0

  • 不在乎那一点点稳定性的请将内核重新编译成4.8,小镇自己的服务器编译成4.8快两个月没有出现过任何的问题。(在小镇的测试下,4.8的性能要比3.0内核的性能高了5%左右,个人觉得没必要做此优化,但是这次是极限优化所以提出来了。具体怎么重新编译内核大家去百度,很简单。)

  • 修改Linux下的io磁盘调度策略,我这里不详细解释,不了解的可以百度(Linux下有三种常用的磁盘io调度,分别是cfq,deadline,noop。大家只要知道noop是最适合ssd硬盘的就行了,因为noop是完全按照请求的顺序来执行,对cpu的压力最低,当io不会存在性能问题的时候,cpu能处理更多的io请求。)
三、Nginx、mysql、php
这三个软件大家可以自己编译安装,但是小镇推荐自己定制使用lnmp一键安装包,下载地址为:https://lnmp.org/download.html,这个不像大家想的像windows下的一键安装一样,他是用sh自动化脚本一步一步实现的编译安装,所以我们可以自己定制编译参数,具体的编译参数大家在include目录下的各个sh文件中找就可以了。下面我来一步一步地讲如何修改。

首先决定所有的软件都使用当前最新版本(当然这个按照大家的需求来,一般来说nginx和mysql选择最新版本没有问题,php版本根据大家所使用的框架的兼容性来。)这里小镇选择的是nginx1.11.5+mysql5.7.16+php7.0.12。

1、php优化
php优化是个重点。在编译参数上大家无需进行任何的修改,这是在lnmp安装完毕后我们需要做的一系列优化。
  • 开启Opcache,这是提升性能最大的方法,相信用php环境的都知道opcache的重要性,具体的原理就是缓存了php解释执行时候的中间码从而在下次执行时无需再次编译。开启方法不会的请百度。

  • 开启hugepage,这个是我在鸟哥的博文(http://www.laruence.com/2015/12/04/3086.html)里面看到的,开启后确实有提升。因为php会把自身的text段,以及内存分配中的huge都采用大内存页来保存,减少TLB miss,从而提高性能。开启方法在shell中执行sysctl vm.nr_hugepages=512,然后在php.ini中加入opcache.huge_code_pages=1便可开启。

  • 使用新的gcc,其实大家这个不用担心,只要你使用的是centos7.0,那么gcc的版本就是4.8以上的,gcc4.8以上php才会开启Global Register for opline and execute_data支持, 这个会带来5%左右的性能提升。

  • 使用PGO训练项目,这种情况比较特殊,当你的项目就专门跑一个wordpress或者自己的一个站时,那么你可以在编译安装php前就使用pgo来训练项目,让php更加的适合你专门使用的web应用,能带来一点点的性能提升,不过这个要看需求。

2、Mysql优化
  • mysql的优化要从编译参数开始入手,首先、采用jemalloc或者tcmalloc能给mysql带来性能更高的内存分配。这就需要在mysql编译的时候加入jemalloc链接的参数,不过大家不用担心,在lnmp一键安装包安装的时候会提示大家是否要安装jemalloc,这里大家选择安装jemalloc即可,不过这里大家要下载最新的jemalloc源码包到src目录下然后修改version.sh中的Jemalloc_Ver为刚下载的jemalloc版本即可(最新版本的jemalloc性能有一定提升,小镇测试过)。

  • mysql默认的引擎一定要是innodb,所以大家在安装引擎选择时请选择innodb引擎。innodb在高并发update的情况下性能要比myisam强不少,不仅如此而且innodb支持事务和行锁,反正不管什么业务环境,现在都没有必需要使用myisam的理由,mysql8.0也移除了myisqm引擎(所以大家请忘掉myisam把)

  • 修改my.cnf配置文件的参数,小镇在这里罗列一些比较重要的参数。首先最重要的参数是innodb_buffer_size,通俗点说这个参数直接决定了你innodb的能力水平,一般来说在单机应用上就设置为内存的60%左右即可,反正php和nginx不会占用太多的内存(之所以说innodb如此的重要,是因为你所有的索引和数据都会按照一定的缓存算法缓存在innodb_buffer_size规定的内存中,当你的一个数据库有2g的时候,而你的innodb_buffer_size大于2g,那么你在频繁读取此数据库的时候其实所有的数据和索引都是在内存中的,不需要io交互,而当你需要的数据超过了innodb_buffer_size就会与硬盘做数据交互,所以当内存增大时与硬盘的数据交互将会相应的减少,所以小镇可以断定的说,内存是对mysql性能影响最大的因素。你看看stackoverflow的数据库服务器的内存,单机384g。。),其次有很多细小的优化,比如innodb_io_capacity等参数,但是影响不如innodb_buffer_size那么明显,小镇不会在这里一一讲解,但是如果你的ssd是intel p3700这种水平的话就把io_capacity设置为3000左右,普通ssd1500左右。
三、nginx优化
老实说,在单机lnmp这种环境下,nginx的优化是没有必要的,因为无论怎么压力大,负载瓶颈是绝对不会出现在nginx上面的,如果说静态请求太多把nginx压垮了,那我相信最先垮掉的是你的带宽,nginx优化是在用作专门的负载均衡和反向代理的时候才需要优化的,而到了那种级别的业务可不是普通的lnmp能扛得住的。所以小镇就不废话了。

TMD怎么感觉写完说了一堆废话? 因为性能优化大多数的时候是靠各位高性能的代码,不要让你的代码拖累了你的服务器。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值