linux apache 性能调优 8G 8核 的服务器

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux apache 性能调优 8G 8核 的服务器相关的知识,希望对你有一定的参考价值。

请问 8G 8核 linux 服务器 apache 跟mysql 如何调优呢?
同时在线几百人的网站 是动态的 及时性强 遇到CC 或者什么 老是卡?
watch -n 1 -d "pgrep httpd|wc -l" 进程增加很快 每次一满 网站就卡

全部都是复制,关闭了

[检测工具]

为了得到完整的调试结果,建议你采用 ApacheBench 或者 httperf之类的软件。如果你对非 LAMP 架构的服务器测试有兴趣的话,建议你采用微软的免费软件: Web Application Stress Tool(需要 NT 或者 2000)。 (其它服务器测试工具)

检测 Apache ,采用 top d 1 显示所有进程的 CPU 和内存情况。另外,还采用 apachectl status 命令

[硬件优化]

1、升级硬件的一般规则:对于 php 脚本而言,主要的瓶颈是 CPU ,对于静态页面而言,瓶颈是内存和网络。一台 400 Mhz 的普通奔腾机器所下载的静态页面就能让 T3 专线(45Mbps)饱和。

2、采用 hdparm 来优化磁盘,一般能提升 IDE 磁盘读写性能 200%,但是对 SCSI 硬盘也有效果。(不同类型的硬盘对比)

[策略优化]

3、Apache 处理 PHP 脚本的速度要比静态页面慢 2-10 倍,因此尽量采用多的静态页面,少的脚本。

4、PHP 脚本如果不做缓冲,每次调用都需要编译,因此,安装一个 PHP 缓冲产品能提升 25-100% 的性能。

5、如果你采用了 Linux 系统,建议升级内核到 2.4,因为静态页面由内核服务。

6、另外一项缓冲技术是把不常修改的 PHP 页面采用 html 缓冲输出。

7、不要在 Web 服务器上运行 X-Windows ,关掉没有必要运行的进程。

8、如果能够用文本就不要用图像,尽量减小图片的尺寸。

9、分散负载,把数据库服务器放到另外的机器上去。采用另外低端的机器服务图片和 HTML 页面,如果所有的静态页面在另外一台服务器上处理,可以设置 httpd.conf 中的 KeepAlives 为 off ,来减少断开连接的时间。

10、以上所有的方法都是针对单机而言的,如果你觉得系统还是不够快,可以采用集群,负载均衡,缓冲技术。采用 Squid 作为缓冲,配置 Squid 的方法。

[编译优化]

11、把基于文件的会话切换到基于共享内存的会话。编译 PHP 时采用 --with-mm 选项,在 php.ini 中设置 set session.save_handler=mm 。这个简单的修改能让会话管理时间缩短一半。

12、采用最新版本的 Apache ,并把 PHP 编译其中,或者采用 DSO 模式,不要采用 CGI 方式。

13、编译 PHP 时,建议采用如下的参数:
--enable-inline-optimization --disable-debug

[配置优化]

14、修改 httpd.conf : 
# 关闭 DNS lookups,PHP 脚本只拿 IP 地址
HostnameLookups off

15、如果网络拥挤,CPU 资源不够用,采用 PHP 的 HTML 压缩功能:
output_handler = ob_gzhandler
PHP 4.0.4 的用户请不要使用,因为存在内存泄漏问题。

16、修改 httpd.conf 中的 SendBufferSize 为你最大的页面文件的大小。加大内核的 TCP/IP 写缓冲大小。

17、采用数据库的持久连接时,不要把 MaxRequestsPerChild 设置得太大。

[第三方软件优化]

18、如果喜欢从修改 Apache 源码入手,可以安装 lingerd。在页面产生和发送后,每个 Apache 进程都会浪费一段时光在客户连接上,Lingerd 能接管这项工作,让 Apache 迅速服务下一个客户请求。

19、如果你足够勇敢的话,还可以采用 Silicon Graphics 的 Accelerated Apache 补丁。这个工程能使 Apache 1.3 快 10 倍,使 Apache 2.0 快 4 倍。

安装一个 PHP 缓冲产品能提升 25-100% 的性能。

[Linux系统优化]

1.清理服务器磁盘碎片:

不论Linux文件系统采用什么文件格式(ext3、JFS、XFS、ReiserFS )、何种类型的硬盘(IDE 、SCSI),随着时间的推移文件系统都会趋向于碎片化。ext3、JFS等高级文件系统可以减少文件系统的碎片化,但是并没有消除。在繁忙的数据库服务器中,随着时间的过去,文件碎片化将降低硬盘性能,硬盘性能从硬盘读出或写入数据时才能注意到。时间长了会发现每个磁盘上确实积累了非常多的垃圾文件,释放磁盘空间可以帮助系统更好地工作。Linux最好的整理磁盘碎片的方法是做一个完全的备份,重新格式化分区,然后从备份恢复文件。但是对于7×24小时工作关键任务服务器来说是比较困难的。Kleandisk是一个高效的磁盘清理工具,它能把磁盘上的文件分成不同的"组",比如把所有的"core"文件归成一组(Group),这样要删除所有core文件时只要删除这个组就行了。core文件是当软件运行出错时产生的文件,它对于软件开发人员比较有用,对于其他用户(比如电子邮件服务器)却没有任何意义。因此,如果没有软件开发的需要,见到core文件就可以将其删除。

2、开启硬盘DMA

现在使用的IDE硬盘基本支持DMA66/100/133(直接内存读取)但是Linux发行版本安装后一般没有打开,可以 /etc/rc.d/rc.local 最後面加上一行: /sbin/hdparm -d1 –x66 -c3 -m16 /dev/hda 这样以后每次开机,硬盘的 DMA 就会开启,不必每次手动设定。添加前后你可以使用命令:hdparm -Tt /dev/hda 来测试对比一下。

3、调整缓冲区刷新参数

Linux内核中,包含了一些对于系统运行态的可设置参数。缓冲刷新的参数可以通过调整 /proc/sys/vm/bdflush文件来完成,这个文件的格式是这样的:

每一栏是一个参数,其中最重要的是前面几个参数。第一个数字是在"dirty"缓冲区达到多少的时候强制唤醒bdflush进程刷新硬盘,第二个数字是每次让bdflush进程刷新多少个dirty块。所谓dirty块是必须写到磁盘中的缓存块。接下来的参数是每次允许bd flush将多少个内存块排入空闲的缓冲块列表。 以上值为RHEL 4.0中的缺省值。可以使用两种方法修改:

(1)使用命令

# echo "100 128 128 512 5000 3000 60 0 0">/proc/sys/vm/bdflush

并将这条命令加到/etc/rc.d/rc.local文件中去。

(2)在/etc/sysctl.conf 文件中加入如下行:

以上的设置加大了缓冲区大小,降低了bdflush被启动的频度,VFS的缓冲刷新机制是Linux文件系统高效的原因之一。

4、优化输入输出

I/O程序对Linux系统性能也是相当重要的,网络硬件I/O对服务器尤其重要。现在大多数Linux服务器使用10/100 Mb以太网。如果有较重的网络负载,则可以考虑千兆以太网卡。如果没有能力购买千兆网卡的话:可以使用多块网卡虚拟成为一块网卡,具有相同的IP地址。这项技术,在Linux中,这种技术称为Bonding。Bonding在Linux2.4以上内核中已经包含了,只需要在编译的时候把网络设备选项中的 Bonding driver support选中见图1。当然利用Bonding技术配置双网卡绑定的前提条件是两块网卡芯片组型号相同,并且都具备独立的Bios芯片。

然后,重新编译核心,重新起动计算机,执行如下命令:

现在两块网卡已经象一块一样工作了。这样可以提高集群节点间的数据传输.bonding对于服务器来是个比较好的选择,在没有千兆网卡时,用两块100兆网卡作bonding,可大大提高服务器到交换机之间的带宽.但是需要在交换机上设置连接bonding网卡的两个子口映射为同一个虚拟接口。编辑 /etc/modules.conf文件,加入如下内容,以使系统在启动时加载Bonding模块。

“mode”的值表示工作模式,共有0、1、2和3四种模式,这里设定为0。Bonding工作在负载均衡(Load Balancing (round-robin))方式下,即两块网卡同时工作,这时理论上Bonding能提供两倍的带宽。Bonding运行在网卡的混杂(Promisc)模式下,而且它将两块网卡的MAC地址修改为一样的。混杂模式就是网卡不再只接收目的硬件地址是自身MAC地址的数据帧,而是可以接收网络上所有的帧。

5、减少虚拟终端机的数量。

Linux安装后系统默认是6个虚拟终端机,也就是 CTRL+ALT F1~F6 那六个,作为服务器使用可以关掉其中四个,只留下 CTRL+ALT F1~F2,大约省下 4 Mbytes 的内存,但是这样一来,X-Window 会从原来的 CTRL+ALT F7 变成 CTRL+ALT F3 。 修改 /etc/inittab 中,将 mingetty 3 ~6 全部加上 # 字号 。

6. 关闭一些不用的服务

Linux服务器在启动时需要启动很多系统服务,它们向本地和网络用户提供了Linux的系统功能接口,直接面向应用程序和用户。提供这些服务的程序是由运行在后台的守护进程(daemons)来执行的。守护进程是生存期长的一种进程。它们独立于控制终端并且周期性的执行某种任务或等待处理某些发生的事件。他们常常在系统引导装入时启动,在系统关闭时终止。linux系统有很多守护进程,大多数服务器都是用守护进程实现的。如Web服务http等。同时,守护进程完成许多系统任务,比如,作业规划进程crond、打印进程lqd等。

参考技术A 以前做过,Linux + nginx的并发请求相当于Linux + apache的100倍,以前测试过!
为什么说Linux+apache比windows+apache性能好,因为我们常说的是LAMP(linux+apache+mysql+php),它的整合后性能远大于windows+apache+php+mysql,如果只是处理静态的html,其实性能差不多的~
其实微软的很多东西适合大公司的,因为价钱很高,小公司耗不起;它对一些软件支持和开源的linux没法比,恰恰适合中小公司的规模,不过现在linux的规模毋容置疑了~ 如果你想测试Linux+apache比windows+apache的性能用,ab测试压力就可以了~不过你说Linux + nginx内存50%左右逐渐增加到90%,不是看那个,主要看你的cache的,如果压力大,你再看下你的I/O读写的一些情况,可以用iostat看~
参考技术B 我用的是小鸟云的服务器,感觉还不错。

linux性能调优总结

系统性能一直是个热门话题。做运维这几年也一直在搞性能调优,写这个文章也算是对工作的总结。

讲调优第一步是,要讲为什么要调优?也就是系统分析,分析还需要有指标,做好性能监控的情况下,看到确实需要调优才能进行。不能为了调优而 “调优“ 那不是调优,那是破坏。

性能分析的目的

找出系统性能瓶颈
为以后的优化提供方案或者参考
达到良好利用资源的目的。硬件资源和软件配置。

影响性能的因素

想确定有哪些因素,首先确定你的应用是什么类型的?
例如:

  1. cpu密集型
    例如web服务器像nginx node.js需要CPU进行批处理和数学计算都属于此类型
  2. io密集型
    例如数据库常见的mysql,大量消耗内存和存储系统,对CPU和网络要求不高,这种应用使用CPU来发起IO请求,然后进入sleep状态。

确定了应用类型就开始分析有哪些情况能影响性能:

大量的网页请求会填满运行队列、大量的上下文切换,中断
大量的磁盘些请求
网卡大量的吞吐
以及内存耗尽等。

归结起来就是4个方面

cpu
memory
i/o
network

系统检测的工具

我们知道了这四大块影响着我们的性能,那我们有什么工具进行检测呢?

技术图片

在工作中常用到的有:
htop vmstat iotop sar strace iftop ss lsof ethtool mtr等

另外推荐阿里的tsar以及glances进行系统性能监控。

CPU 性能监控以及调优

我们可以 通过检查cpu使用量,通过工具观测上下文切换、中断以及代码调用等方面来进行优化。

首先明确几个术语:
缓存:为了提供内存i/o性能cpu提供硬件级缓存。查看缓存可以用过 lscpu -p命令来查看

[root@master ~]# lscpu
L1d 缓存:          32K
L1i 缓存:          32K
L2 缓存:           256K
L3 缓存:           3072K

1级缓存为静态缓存,分为数据缓存和指令缓存。
2级和3级缓存为动态缓存,其中2级缓存为共享缓存。

为了提高cpu缓存命中率我们通常的做法是把cpu绑定在某一个核上,也就是”cpu亲和性”
linux下我们可以通过”taskset”命令来实现

[root@master ~]# taskset -pc 0 6552
pid 6552s current affinity list: 0
pid 6552s new affinity list: 0

但是这样还是有问题。例如不能保证本地内存分配,所以这时候我们需要使用numa来解决问题

NUMA:非一致性内存访问机制。每个屋里核心都有一段自己使用的内存成为本地节点,都有自己的内存控制器,距离最近的内存节点成称为邻均节点。

技术图片

 

 

上图为numa的简单的拓扑,来源于互联网。

numactl可以将程序绑定到特定的numa节点

# numactl --show #查看当前的numa配置
policy: default
preferred node: current
physcpubind: 0 
cpubind: 0 
nodebind: 0 
membind: 0 

注:数据库服务器不要用numa,如果要使用请在数据库启动请使用numactl —interleave=all。作为运维可能都被坑过。

cpu调度策略

  1. 实时调度策略
    • SCHED_FIFO 静态调度策略,一旦占用cpu则一直运行,一直运行直到有更高优先级任务到达或自己放弃。
    • SCHED_RR 时间轮询策略,当进程的时间片用完,系统将重新分配时间片,并置于就绪队列尾。放在队列尾保证了所有具有相同优先级的RR任务的调度公平。
      实时调度策略作用值为1-99,数字越大优先级越高。
  2. 一般策略
    • SCHED_OTHER 默认调度策略通过nice和counter值决定权值,nice越小,counter越大,被调度的概率越大,也就是曾经使用了cpu最少的进程将会得到优先调度。作用值为100-139,数字越小优先级越高。
    • SCHED_BATCH
    • SCHED_IDLE

chrt 修改实时优先级,生产中一般不要修改,默认是rr调度

SCHED_OTHER 使用nice、renice修改。
另外other支持动态调整,如果手动直接nice修改即可。

context switches:上下文切换

linux内核将每一个core当作一个独立的处理器。一个内核可以同时运行50~50000个进程。每个线程将会分配一个时间片,直到这个线程的时间片用完,或是被更高优先级的线程抢占,它才会被重新放回cpu队列。切换线程的过程就是context switch。context switch越高,则内核调度的工作负担越大。

vmstat 既可以看到 cs的高低

run queue 运行队列

每个cpu都有一个运行队列。线程,要么在sleep状态(阻塞并等待IO),要么在运行状态。运行队列越长,则等待cpu处理这个线程的时间越长。运行队列是全局的会被所有CPU共享

load就是用来描述运行队列的。它的值等于当前正在处理的线程+运行队列里面的线程。

比如当前系统核数是2,有两个线程正在执行行,还有4个线程在运行队列里面,那么它的load=2+4。

vmstat w uptime 都可以观测运行队列负载情况。

cpu性能监控

说了这么多,那正常情况下需要观察哪些值呢?
首先numa 以及算法都是特殊情况下优化的,一般情况下不会去动这些,需要根据你的业务场景来进行绑定调整,像虚拟化,云计算等可能就需要进行调整。

那么我们日常需要观测的性能点是:

  1. cpu利用率
    • us 60%-70%
    • sy 30%-35%
    • id 0%-5%
  2. cs上下文切换
    • cs和cpu利用率相关,如果能保持上面所说的利用率大量的切换可以接受
  3. 运行队列
    • 小于等于4最好

例子:

# vmstat 1 5
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 3  0 1150840 271628 260684 5530984    0    0     2     1    0    0 22  4 73  0  0
 5  0 1150840 270264 260684 5531032    0    0     0     0 5873 6085 13 13 73  0  0
 5  0 1150840 263940 260684 5531040    0    0     0     4 6721 7507 15 13 72  0  0
 4  0 1150840 263320 260684 5531068    0    0     0     0 6111 7117 10 13 76  0  0
 4  0 1150840 262328 260684 5531072    0    0     0     0 6854 7673 18 13 68  0  0

例子中cpu中断(in)以及上下文切换(cs)都比较高,说明内核不得不来回切换进程,同时in也是比较高说明cpu一直在请求资源。

内存memory

术语
MMU:
CPU是不能与硬盘打交道的,只有数据被载入到内存中才可以被CPU调用。cpu在访问内存的时候需要先像内存监控程序请求,由监控程序控制和分配内存的读写请求,这个监控程序叫做MMU(内存管理单元)

线性地址到物理地址的映射,如果按照1个字节1个字节映射的话,需要一张非常大的表,这种转换关系会非常的复杂。因此把内存空间又划分成了另外一种存储单元格式,通常为4K。

每个进程如果需要访问内存的时候都需要去查找page table的话需要借助缓冲器TLB,但每次产找tlb没有或者大量查找还是会造成缓慢,所以又有了page table的分级目录。page table可以分为1级目录,2级目录和偏移量。

另外让系统管理大量内存有两种方法:

  1. 增加硬件内存管理单元中页表数
  2. 增大页面大小
    第一种方法不太现实,所有我们考虑第二种方法。即:大页面。
    32位系统4m大页框64位系统2m大页框,页框越粗浪费越严重。
    查看系统的大页面:

    cat /proc/meminfo

    AnonHugePages: 309248 kB
    HugePages_Total: 0
    HugePages_Free: 0
    HugePages_Rsvd: 0
    HugePages_Surp: 0
    Hugepagesize: 2048 kB
    DirectMap4k: 6144 kB
    DirectMap2M: 1042432 kB
    DirectMap1G: 0 kB
    AnonHugePages:透明大页面,THP是一个提取层,可自动创建、管理和使用超大页面的大多数方面。
    另外HP必须在引导时设置。
    手动设置大页面的页数:
    sysctl vm.nr_hugepages = 20

DMA:直接读取内存
在实现DMA传输时,是由DMA控制器直接掌管总线,因此,存在着一个总线控制权转移问题。即DMA传输前,CPU要把总线控制权交给DMA控制器,而在结束DMA传输后,DMA控制器应立即把总线控制权再交回给CPU。一个完整的DMA传输过程必须经过DMA请求、DMA响应、DMA传输、DMA结束4个步骤。

虚拟内存:
32位的系统上每一个进程在访问内存的时候,每一个进程都当做自己有4个G的内存空间可用,这叫虚拟内存(地址),虚拟内存转化成物理内存是通过MMU来完成的。生产中我们尽量不使用虚拟内存。

影响系统性能的几个内存参数:

  1. overcommit_memory 过量使用内存
    • 0 默认设置系统决定是否过量使用。
    • 1 不过量使用
    • 2 过量使用但有一定的比例默认百分值五十由overcommit_ratio决定(他就是默认的50),举个例子物理内存8g,swap4g,可以过量使用10g。
      注:生产中尽量避免过量使用,例如redis要关闭过量使用。
  2. spappines
    -将不活跃的进程换进swap。注:尽量不去使用swap。
    生产中设置:
    echp 10 > /proc/sys/vm/swappines
  3. 回收内存
    • 这个值设定为 1、2 或者 3 让内核放弃各种页缓存和 slab 缓存的各种组合。
      1 系统无效并释放所有页缓冲内存即buffers
      2 系统释放所有未使用的 slab 缓冲内存。即cached
      3 系统释放所有页缓冲和 slab 缓冲内存。
      生产中使用:
      1.运行sync
    1. echo 3>/proc/sys/vm/drop_caches

i/o

IO子系统一般是linux系统中最慢的部分。一个原因是它距离CPU的距离,另一个原因是它的物理结构。因此尽量要减少磁盘IO。

磁盘调度策略:

[root@master ~]# cat /sys/block/sda/queue/scheduler 
noop [deadline] cfq 

其中当前使用cfq策略。
cfq:完全公平调度。在其时间片段中,进程每次最多可有八个请求(默
认)。调度程序会尝试根据历史数据估计某个程序是否会在近期发出更多 I/O,然后 CFQ 会闲置,等待那个
I/O,即使有其他进程正在等待发出 I/O
deadline:每一个请求在指定的期限前必须得到服务。
noop:没有策略
anticipatory:已被抛弃,写多读少的场景使用。

linux内核以page为单位访问磁盘IO,一般为4K。
查看page: /usr/bin/time -v date

MPF
linux会将内存物理地址空间映射到虚拟内存,内核仅会映射需要的内存页。当应用启动时,内核依次搜索CPU cache和物理内存,查找是否有相应的内存页,如果不存在,则内核将会发起一次MPF(major page fault),将磁盘中的数据读出并缓存到内存中。

如果在buffer cache找到了对应的内存页,则将会产生一个MnPF(minor page fault).

/usr/bin/time -v helloworld
第一次执行会发现大部分是MPF
第二次执行会发现大部分是MnPF

The File Buffer Cache

file buffer cache用来减少MPF,增加MnPF,它将会持续增长,直到可用内存比较少或是内核需要为其它应用来释放一些内存。free内存比较少,并不能说明系统内存紧张,只能说明linux系统充分使用内存来做cache.

[root@master ~]# cat /proc/meminfo 
MemTotal:         995896 kB
MemFree:          715976 kB
MemAvailable:     719832 kB
Buffers:            3140 kB

将数据页写回磁盘
可以使用fsync()或是sync()立即写回,如果没有直接调用这些函数,pdflush会定期刷回磁盘。

iotop可以显示所有进程的IO占用情况
lsof可以查看所有的调用并打开的文件

其他命令:
vmstat sar iostat top htop等

 



















































以上是关于linux apache 性能调优 8G 8核 的服务器的主要内容,如果未能解决你的问题,请参考以下文章

jvm 调优

Linux 性能调优工具 9 张图 - 你肯定会用到!

记录一次系统性能调优过程

tomcat8调优

elasticsearch 6000w数据,qps200,4台8核8g内存的服务器够用吗

4核8线程虚拟机分配多少