1、Cpu:

Top后看到大部分都是php-fpm和mysql占去的资源较多!

这里随便也巩固一下linux top命令的知识,部分来自网络,这个也是很有用的!

phpmssql2008php nginx mysql 网站优化计划记载 Ruby

Top的第一、第二行:

Up 51days -------机器已经运行了51天了

2 users ------- 现在机器上面有个连接用户

Load average 0.16 0.10 0.07 ------- 分别是5分钟、10分钟、15分钟均匀负载

Tasks 245 total ------------现在一共245个进程

1 running ----------有一个正在运行的进程

244 sleeping ---------244个就寝进程 (是不是有点多啊,详细是那些后面再详细查一下)

0 stopped ----------- 0个被停滞或者终止的进程(不明白这里是什么意思,是逼迫中断的?)

0 zombie --------0个僵去世的进程

第三行是现实cpu状态的:

0.8%us ----------这是当前用户进程占去的cpu百分比

0.1%sy ---------这是当前系统进程占去的cpu百分比

0.0%ni ---------这是nice状态下占去的百分比,nice是经由系统优化过的意思(这个系数越到是不是代表用户跑的进程很垃圾啊,都要linux内核帮忙优化?又或者是在负载很大的时候系统才会进行优化?)

98.4%id ---------idle空闲的cpu百分比(很多啊,证明cpu资源当前是足够的啊!
)

0.7%wa --------waite等待进程占去cpu百分比(也不多啊!
)

0.0%hi --------hard interrupt 硬中断要求

0.0%st --------这个貌似是用到虚拟机的是才会有的,网上有先容是虚拟出来的cpu,在提升效率的时候往真的cpu资源窃取一定的资源,估计一样平常不是做事器做虚拟化的时候都用不到!

第四、五行是内存利用状况:

Mem: 24692204k total

物理内存总量

10338168k used

利用的物理内存总量

14354036k free

空闲内存总量

1445008k buffers

用作内核缓存的内存量

Swap: 1998832k total

交流区总量

3968k used

利用的交流区总量

1994864k free

空闲交流区总量

1188012k cached

缓冲的交流区总量。
内存中的内容被换出到交流区,而后又被换入到内存,但利用过的交流区尚未被覆盖,该数值即为这些内容已存在于内存中的交流区的大小。
相应的内存再次被换出时可不必再对交流区写入。

#Free

实际的程序可用内存数怎么算呢?

free + (buffers + cached)

程序已用内存数又怎么算呢?

used – (buffers + cached)

buffer 与cache 的差异:

A buffer is something that has yet to be “written” to disk. Acache is something that has been “read” from the disk and stored for later use 从运用程序角度来看,buffers/cached是即是可用的,由于buffer/cached是为了提高文件读写的性能,当运用程序需在用到内存的时候,buffer/cached会很快地被回收。

以是从运用程序的角度来说,可用内存 = 系统free memory + buffers + cached.

buffers是指用来给块设备做的缓冲大小,他只记录文件系统的metadata以及 tracking in-flight pages.

cached是用来给文件做缓冲。

那便是说:buffers是用来存储,目录里面有什么内容,权限等等。

而cached直接用来影象我们打开的文件,如果你想知道他是不是真的生效,你可以试一下,先后实行两次命令#man X ,你就可以明显的觉得到第二次的开打的速率快很多。

第五行后面便是一些进程运行状态:

列名

含义

PID

进程id

PPID

父进程id

RUSER

Real user name

UID

进程所有者的用户id

USER

进程所有者的用户名

GROUP

进程所有者的组名

TTY

启动进程的终端名。
不是从终端启动的进程则显示为 ?

PR

优先级

NI

nice值。
负值表示高优先级,正值表示低优先级

P

末了利用的CPU,仅在多CPU环境下故意义

%CPU

上次更新到现在的CPU韶光占用百分比

TIME

进程利用的CPU韶光总计,单位秒

TIME+

进程利用的CPU韶光总计,单位1/100秒

%MEM

进程利用的物理内存百分比

VIRT

进程利用的虚拟内存总量,单位kb。
VIRT=SWAP+RES

SWAP

进程利用的虚拟内存中,被换出的大小,单位kb。

RES

进程利用的、未被换出的物理内存大小,单位kb。
RES=CODE+DATA

CODE

可实行代码占用的物理内存大小,单位kb

DATA

可实行代码以外的部分(数据段+栈)占用的物理内存大小,单位kb

SHR

共享内存大小,单位kb

nFLT

页面缺点次数

nDRT

末了一次写入到现在,被修正过的页面数。

S

进程状态。

D=不可中断的就寝状态

R=运行

S=就寝

T=跟踪/停滞

Z=僵尸进程

COMMAND

命令名/命令行

WCHAN

若该进程在就寝,则显示就寝中的系统函数名

Flags

任务标志,参考 sched.h

查看指定列:

默认情形下仅显示比较主要的 PID、USER、PR、NI、VIRT、RES、SHR、S、%CPU、%MEM、TIME+、COMMAND 列。

可以通过下面的快捷键来变动显示内容:

5.1 f 键选择显示内容

通过 f 键可以选择显示的内容。
按 f 键之后会显示列的列表,按 a-z 即可显示或隐蔽对应的列,末了按回车键确定。

5.2 o 键改变显示顺序

按 o 键可以改变列的显示顺序。
按小写的 a-z 可以将相应的列向右移动,而大写的 A-Z 可以将相应的列向左移动。
末了按回车键确定。

5.3 F/O 键将进程按列排序

按大写的 F 或 O 键,然后按 a-z 可以将进程按照相应的列进行排序。
而大写的 R 键可以将当前的排序倒转。

常用交互命令:

从利用角度来看,闇练的节制这些命令比节制选项还主要一些。
这些命令都是单字母的,如果在命令行选项中利用了s选项,则可能个中一些命令会被屏蔽掉。

Ctrl+L 擦除并且重写屏幕。

h或者? 显示帮助画面,给出一些简短的命令总结解释。

k 终止一个进程。
系统将提示用户输入须要终止的进程PID,以及须要发送给该进程什么样的旗子暗记。
一样平常的终止进程可以利用15旗子暗记;如果不能正常结束那就利用旗子暗记9逼迫结束该进程。
默认值是旗子暗记15。
在安全模式中此命令被屏蔽。

i 忽略闲置和僵去世进程。
这是一个开关式命令。

q 退出程序。

r 重新安排一个进程的优先级别。
系统提示用户输入须要改变的进程PID以及须要设置的进程优先级值。
输入一个正值将使优先级降落,反之则可以使该进程拥有更高的优先权。
默认值是10。

S 切换到累计模式。

s 改变两次刷新之间的延迟韶光。
系统将提示用户输入新的韶光,单位为s。
如果有小数,就换算成m s。
输入0值则系统将不断刷新,默认值是5 s。
须要把稳的是如果设置太小的韶光,很可能会引起不断刷新,从而根本来不及看清显示的情形,而且系统负载也会大大增加。

f或者F 从当前显示中添加或者删除项目。

o或者O 改变显示项目的顺序。

l 切换显示均匀负载和启动韶光信息。

m 切换显示内存信息。

t 切换显示进程和CPU状态信息。

c 切换显示命令名称和完全命令行。

M 根据驻留内存大小进行排序。

P 根据CPU利用百分频年夜小进行排序。

T 根据韶光/累计韶光进行排序。

W 将当前设置写入~/.toprc文件中。
这是写top配置文件的推举行法。

末了的技能:top 命令小技巧:

1、输入大写P,则结果按CPU占用降序排序。

2、输入大写M,结果按内存占用降序排序。

3、按数字 1 则可以显示所有CPU核心的负载情形。

4、top -d 5 每隔 5 秒刷新一次,默认 1 秒

5、top -p 4360,4358 监控指定进程

6、top -U johndoe ‘U’为真实/有效/保存/文件系统用户名。

7、top -u 500 ‘u’为有效用户标识

8、top -bn 1 显示所有进程信息,top -n 1 只显示一屏信息,供管道调用

9、top -M #show memory summary in megabytes not kilobytes

10、top -p 25097 -n 1 -b # -b 避免输出掌握字符,管道调用涌现乱码

11、top翻页:top -bn1 | less

12、增强版的 top:htop

在检讨做事器资源情形的命令还有以下一些:

#vmstat 2 3

对上面每项的输出阐明如下:

procs

r列表示运行和等待cpu韶光片的进程数,这个值如果长期大于系统CPU的个数,解释CPU不敷,须要增加CPU。

b列表示在等待资源的进程数,比如正在等待I/O、或者内存交流等。

memory

swpd列表示切换到内存交流区的内存数量(以k为单位)。
如果swpd的值不为0,或者比较大,只要si、so的值长期为0,这种情形下一样平常不用担心,不会影响系统性能。

free列表示当前空闲的物理内存数量(以k为单位)

buff列表示buffers cache的内存数量,一样平常对块设备的读写才须要缓冲。

cache列表示page cached的内存数量,一样平常作为文件系统cached,频繁访问的文件都会被cached,如果cache值较大,解释cached的文件数较多,如果此时IO中bi比较小,解释文件系统效率比较好。

swap

si列表示由磁盘调入内存,也便是内存进入内存交流区的数量。

so列表示由内存调入磁盘,也便是内存交流区进入内存的数量。

一样平常情形下,si、so的值都为0,如果si、so的值长期不为0,则表示系统内存不敷。
须要增加系统内存。

IO项显示磁盘读写状况

Bi列表示从块设备读入数据的总量(即读磁盘)(每秒kb)。

Bo列表示写入到块设备的数据总量(即写磁盘)(每秒kb)

这里我们设置的bi+bo参考值为1000,如果超过1000,而且wa值较大,则表示系统磁盘IO有问题,该当考虑提高磁盘的读写性能。

system 显示采集间隔内发生的中断数

in列表示在某一韶光间隔中不雅观测到的每秒设备中断数。

cs列表示每秒产生的高下文切换次数。

上面这2个值越大,会看到由内核花费的CPU韶光会越多。

CPU项显示了CPU的利用状态,此列是我们关注的重点。

us列显示了用户进程花费的CPU 韶光百分比。
us的值比较高时,解释用户进程花费的cpu韶光多,但是如果长期大于50%,就须要考虑优化程序或算法。

sy列显示了内核进程花费的CPU韶光百分比。
Sy的值较高时,解释内核花费的CPU资源很多。

根据履历,us+sy的参考值为80%,如果us+sy大于 80%解释可能存在CPU资源不敷。

id 列显示了CPU处在空闲状态的韶光百分比。

wa列显示了IO等待所占用的CPU韶光百分比。
wa值越高,解释IO等待越严重,根据履历,wa的参考值为20%,如果wa超过20%,解释IO等待严重,引起IO等待的缘故原由可能是磁盘大量随机读写造成的,也可能是磁盘或者磁盘掌握器的带宽瓶颈造成的(紧张是块操作)。

综上所述,在对CPU的评估中,须要重点把稳的是procs项r列的值和CPU项中us、sy和id列的值。

检讨CPU性能的第二个工具是sar,sar功能很强大,可以对系统的每个方面进行单独的统计,但是利用sar命令会增加系统开销,不过这些开销是可以评估的,对系统的统计结果不会有很大影响。

下面是sar命令对某个别系的CPU统计输出:

[root@webserver ~]# sar -u 3 5

Linux 2.6.9-42.ELsmp (webserver) 11/28/2008 _i686_ (8 CPU)

11:41:24 AM CPU %user %nice %system %iowait %steal %idle

11:41:27 AM all 0.88 0.00 0.29 0.00 0.00 98.83

11:41:30 AM all 0.13 0.00 0.17 0.21 0.00 99.50

11:41:33 AM all 0.04 0.00 0.04 0.00 0.00 99.92

11:41:36 AM all 0.29 0.00 0.13 0.00 0.00 99.58

11:41:39 AM all 0.38 0.00 0.17 0.04 0.00 99.41

Average: all 0.34 0.00 0.16 0.05 0.00 99.45

对上面每项的输出阐明如下:

%user列显示了用户进程花费的CPU 韶光百分比。

%nice列显示了运行正常进程所花费的CPU 韶光百分比。

%system列显示了系统进程花费的CPU韶光百分比。

%iowait列显示了IO等待所占用的CPU韶光百分比

%steal列显示了在内存相对紧张的环境下pagein逼迫对不同的页面进行的steal操作。

%idle列显示了CPU处在空闲状态的韶光百分比。

这个输出是对系统整体CPU利用状况的统计,每项的输出都非常直不雅观,并且末了一行Average是个汇总行,是上面统计信息的一个均匀值。

须要把稳的一点是:第一行的统计信息中包含了sar本身的统计花费,以是%user列的值会偏高一点,不过,这不会对统计结果产生多大影响。

在一个多CPU的系统中,如果程序利用了单线程,会涌现这么一个征象,CPU的整体利用率不高,但是系统运用却相应缓慢,这可能是由于程序利用单线程的缘故原由,单线程只利用一个CPU,导致这个CPU占用率为100%,无法处理其它要求,而其它的CPU却闲置,这就导致了整体CPU利用率不高,而运用缓慢征象的发生。

针对这个问题,可以对系统的每个CPU分开查询,统计每个CPU的利用情形:

[root@webserver ~]# sar -P 0 3 5

Linux 2.6.9-42.ELsmp (webserver) 11/29/2008 _i686_ (8 CPU)

06:29:33 PM CPU %user %nice %system %iowait %steal %idle

06:29:36 PM 0 3.00 0.00 0.33 0.00 0.00 96.67

06:29:39 PM 0 0.67 0.00 0.33 0.00 0.00 99.00

06:29:42 PM 0 0.00 0.00 0.33 0.00 0.00 99.67

06:29:45 PM 0 0.67 0.00 0.33 0.00 0.00 99.00

06:29:48 PM 0 1.00 0.00 0.33 0.33 0.00 98.34

Average: 0 1.07 0.00 0.33 0.07 0.00 98.53

这个输出是对系统的第一颗CPU的信息统计,须要把稳的是,sar中对CPU的计数是从0开始的,因此,“sar -P 0 3 5”表示对系统的第一颗CPU进行信息统计,“sar -P 4 3 5”则表示对系统的第五颗CPU进行统计。
依次类推。
可以看出,上面的系统有八颗CPU。

2、内存:

=============================================================

可以利用一下命令查利用内存最多的10个进程

ps -aux | sort -k4nr | head -n 10

或者top (然后按下M,把稳大写)

可以利用一下命令查利用CPU最多的10个进程

ps -aux | sort -k3nr | head -n 10

或者top (然后按下P,把稳大写)

mysql 11234 4.6 1.2 4509704 309872 ? Ssl Feb08 3457:37 /usr/sbin/mysqld

www-data 31112 0.0 0.4 384968 99872 ? S 03:10 0:03 php-fpm: pool www

www-data 31082 0.0 0.3 374716 89560 ? S 03:10 0:02 php-fpm: pool www

www-data 31085 0.0 0.3 362656 77428 ? S 03:10 0:01 php-fpm: pool www

www-data 31086 0.0 0.3 364540 79100 ? S 03:10 0:02 php-fpm: pool www

www-data 31087 0.0 0.3 373984 88796 ? S 03:10 0:03 php-fpm: pool www

www-data 31089 0.0 0.3 366432 81048 ? S 03:10 0:01 php-fpm: pool www

www-data 31094 0.0 0.3 364804 79688 ? S 03:10 0:03 php-fpm: pool www

www-data 31097 0.0 0.3 370788 85620 ? S 03:10 0:01 php-fpm: pool www

www-data 31098 0.0 0.3 375548 90172 ? S 03:10 0:03 php-fpm: pool www

创造mysql跟php-fpm霸占的内存是最多的,于是就动手看看

①进入mysql看看:

Mysql>showglobal status like 'Innodb_buffer_pool_pages_data';

+-------------------------------+-------+

| Variable_name | Value |

+-------------------------------+-------+

| Innodb_buffer_pool_pages_data | 7599 |

+-------------------------------+-------+

1 row in set (0.03 sec)

Mysql>SHOWGLOBAL STATUS LIKE 'Innodb_buffer_pool_pages_total';

+--------------------------------+-------+

| Variable_name | Value |

+--------------------------------+-------+

| Innodb_buffer_pool_pages_total |8192 |

+--------------------------------+-------+

1 row in set (0.00 sec)

Mysql>SHOWGLOBAL STATUS LIKE 'Innodb_page_size';

+------------------+-------+

| Variable_name | Value |

+------------------+-------+

| Innodb_page_size | 16384 |

+------------------+-------+

1 row in set (0.00 sec)

'Innodb_buffer_pool_pages_data' X 100 /'Innodb_buffer_pool_pages_total'

当结果 > 95% 则增加 innodb_buffer_pool_size,建议利用 ram total 75%

当结果 < 95% 则减少 innodb_buffer_pool_size,

建议 'Innodb_buffer_pool_pages_data' X 'Innodb_page_size' X 1.05 /(102410241024)

貌似mysql也没有太大的问题!

===================================================================

#free

total used free shared buffers cached

Mem: 24692204 21925456 2766748 0 5120908 10888396

-/+ buffers/cache: 5916152 18776052

Swap: 1998832 3972 1994860

内存占用都90以上了,要开释一下内存

#cat /proc/sys/vm/drop_caches

0

首先,/proc/sys/vm/drop_caches的值,默认为0

# sync

手动实行sync命令(描述:sync 命令运行 sync 子例程。
如果必须停滞系统,则运行 sync 命令以确保文件系统的完全性。
sync 命令将所有未写的系统缓冲区写到磁盘中,包含已修正的 i-node、已延迟的块 I/O 和读写映射文件)

# echo 3 >/proc/sys/vm/drop_caches

# cat/proc/sys/vm/drop_caches

3

#free

total used free shared buffers cached

Mem: 24692204 4741228 19950976 0 9380 431832

-/+ buffers/cache: 4300016 20392188

Swap: 1998832 3972 1994860

一下子开释了这么多内存!

===========================================================================

3、io:

#iostat –d –k 1 10

参数 -d 表示,显示设备(磁盘)利用状态;-k某些利用block为单位的列逼迫利用Kilobytes为单位;1 10表示,数据显示每隔1秒刷新一次,共显示10次。

tps:该设备每秒的传输次数(Indicatethe number of transfers per second that were issued to the device.)。
“一次传输”意思是“一次I/O要求”。
多个逻辑要求可能会被合并为“一次I/O要求”。
“一次传输”要求的大小是未知的。

kB_read/s:每秒从设备(driveexpressed)读取的数据量;kB_wrtn/s:每秒向设备(drive expressed)写入的数据量;kB_read:读取的总数据量;kB_wrtn:写入的总数量数据量;这些单位都为Kilobytes。

# iostat -d -x -k 1 10

rrqm/s:每秒这个设备干系的读取要求有多少被Merge了(当系统调用须要读取数据的时候,VFS将要求发到各个FS,如果FS创造不同的读取要求读取的是相同Block的数据,FS会将这个要求合并Merge);wrqm/s:每秒这个设备干系的写入要求有多少被Merge了。

rsec/s:每秒读取的扇区数;wsec/:每秒写入的扇区数。
r/s:The numberof read requests that were issued to the device per second;w/s:The numberof write requests that were issued to the device per second;

await:每一个IO要求的处理的均匀韶光(单位是微秒毫秒)。
这里可以理解为IO的相应韶光,一样平常地系统IO相应韶光该当低于5ms,如果大于10ms就比较大了。

%util:在统计韶光内所有处理IO韶光,除以统共统计韶光。
例如,如果统计间隔1秒,该设备有0.8秒在处理IO,而0.2秒闲置,那么该设备的%util = 0.8/1 = 80%,以是该参数暗示了设备的繁忙程度。
一样平常地,如果该参数是100%表示设备已经靠近满负荷运行了(当然如果是多磁盘,纵然%util是100%,由于磁盘的并发能力,以是磁盘利用未必就到了瓶颈)。

一样平常iostat的用法命令如下:

iostat -d -k 1 10 #查看TPS和吞吐量信息

iostat -d -x -k 1 10 #查看设备利用率(%util)、相应韶光(await)

iostat -c 1 10 #查看cpu状态

根据上面的iostat出来的数据,貌似做事器io也是没有太大的问题!

4、php+nginx的配置:

①有时候搭建好的环境,在启动的时候就无法启动,如果没有干系日志记录的话,不妨用stract命令来跟踪一下程序的运行情形

#strace /usr/local/php/bin/php -i 2 >/tmp/php1.log ------查看php运行,并记录在/tmp/php1.log里面,这样就看php1.log就知道哪里出问题了。

②php跟nginx是通过php-fpm进行通信的,可以直接修正php-fpm.conf

影响PHP(5.0以上)运行效率的参数有如下:

pm = dynamic

pm.max_children = 512

pm.start_servers = 128

pm.min_spare_servers = 64

pm.max_spare_servers =256

pm.max_requests = 50000

下面逐一先容他们的浸染:

pm = dynamic:表示动态调度

pm.max_children = 512:表示做事器最大许可运行的子进程,这个紧张是为了限定PHP运行,防止内存等资源被PHP耗光

pm.start_servers = 128:表示启动PHP的时候天生多少个子进程

pm.min_spare_servers = 64:表示做事器在空闲的时候最小保持的子进程数,把稳不是空闲的线程,而是在做事器空闲的时候要保持待命状态的最小子进程数

pm.max_spare_servers =256:表示做事器在空闲的时候最大保持的子进程数,把稳不是空闲的线程,而是在做事器空闲的时候要保持待命状态的最大子进程数

pm.max_requests = 50000:表示每个子进程在respawning(重生也便是重启)之前能要处理的最大要求数

对付LNMP架构

有几个参数须要调度,且保持一贯

1,nginx配置文件中:

vi /usr/local/lnmp/nginx/conf/nginx.conf

worker_connections 65535;

2,php配置文件中:

vi /usr/local/lnmp/php/etc/php-fpm.conf

rlimit_files = 65535

3,操作系统中

vi /etc/sysctl.conf

fs.file-max = 65535

没有这个选项这在最底部添加即可

4,操作系统设置

ulimit -SHn 65535

echo \"大众ulimit -SHn 65535\"大众 /etc/profile

③nginx优化,我这里引用了一下网上别人的方法,很值得借鉴

一样平常来说nginx配置文件中对优化比较有浸染的为以下几项:

worker_processes 8;

nginx进程数,建议按照cpu数目来指定,一样平常为它的倍数,平时设置为2倍。

worker_cpu_affinity 00000001 0000001000000100 00001000 00010000 00100000 01000000 10000000;

为每个进程分配cpu,上例中将8个进程分配到8个cpu,当然可以写多个,或者将一个进程分配到多个cpu。
对worker_cu_affinity参数的优化参考:http://blog.haohtml.com/archives/14835

worker_rlimit_nofile 102400;

这个指令是指当一个nginx进程打开的最多文件描述符数目,理论值该当是最多打开文件数(ulimit -n)与nginx进程数相除,但是nginx分配要求并不是那么均匀,以是最好与ulimit -n的值保持同等。

use epoll;

利用epoll的I/O模型,这个不用说了吧。

worker_connections 102400;

每个进程许可的最多连接数,理论上每台nginx做事器的最大连接数为worker_processesworker_connections。

keepalive_timeout 60;

keepalive超时时间。

client_header_buffer_size 4k;

客户端要求头部的缓冲区大小,这个可以根据你的系统分页大小来设置,一样平常一个要求头的大小不会超过1k,不过由于一样平常系统分页都要大于1k,以是这里设置为分页大小。
分页大小可以用命令getconf PAGESIZE取得。

open_file_cache max=102400 inactive=20s;

这个将为打开文件指定缓存,默认是没有启用的,max指定缓存数量,建媾和打开文件数同等,inactive是指经由多永劫光文件没被要求后删除缓存。

open_file_cache_valid 30s;

这个是指多永劫光检讨一次缓存的有效信息。

open_file_cache_min_uses 1;

open_file_cache指令中的inactive参数韶光内文件的最少利用次数,如果超过这个数字,文件描述符一贯是在缓存中打开的,如上例,如果有一个文件在inactive韶光内一次没被利用,它将被移除。

关于内核参数的优化(/etc/sysctl.conf):

net.ipv4.tcp_max_tw_buckets = 6000

timewait的数量,默认是180000。

net.ipv4.ip_local_port_range =1024 65000

许可系统打开的端口范围。

net.ipv4.tcp_tw_recycle = 1

启用timewait快速回收。

net.ipv4.tcp_tw_reuse = 1

开启重用。
许可将TIME-WAIT sockets重新用于新的TCP连接。

net.ipv4.tcp_syncookies = 1

开启SYN Cookies,当涌现SYN等待行列步队溢出时,启用cookies来处理。

net.core.somaxconn = 262144

web运用中listen函数的backlog默认会给我们内核参数的net.core.somaxconn限定到128,而nginx定义的NGX_LISTEN_BACKLOG默认为511,以是有必要调度这个值。

net.core.netdev_max_backlog = 262144

每个网络接口吸收数据包的速率比内核处理这些包的速率快时,许可送到行列步队的数据包的最大数目。

net.ipv4.tcp_max_orphans = 262144

系统中最多有多少个TCP套接字不被关联到任何一个用户文件句柄上。
如果超过这个数字,孤儿连接将即刻被复位并打印出警告信息。
这个限定仅仅是为了防止大略的DoS攻击,不能过分依赖它或者人为地减小这个值,更该当增加这个值(如果增加了内存之后)。

net.ipv4.tcp_max_syn_backlog = 262144

记录的那些尚未收到客户端确认信息的连接要求的最大值。
对付有128M内存的系统而言,缺省值是1024,小内存的系统则是128。

net.ipv4.tcp_timestamps = 0

韶光戳可以避免序列号的卷绕。
一个1Gbps的链路肯定会碰着以前用过的序列号。
韶光戳能够让内核接管这种“非常”的数据包。
这里须要将其关掉。

net.ipv4.tcp_synack_retries = 1

为了打开对真个连接,内核须要发送一个SYN并附带一个回应前面一个SYN的ACK。
也便是所谓三次握手中的第二次握手。
这个设置决定了内核放弃连接之前发送SYN+ACK包的数量。

net.ipv4.tcp_syn_retries = 1

在内核放弃建立连接之前发送SYN包的数量。

net.ipv4.tcp_fin_timeout = 1

如果套接字由本端哀求关闭,这个参数决定了它保持在FIN-WAIT-2状态的韶光。
对端可以出错并永久不关闭连接,乃至意外当机。
缺省值是60 秒。
2.2 内核的常日值是180秒,你可以按这个设置,但要记住的是,纵然你的机器是一个轻载的WEB做事器,也有由于大量的去世套接字而内存溢出的风险,FIN- WAIT-2的危险性比FIN-WAIT-1要小,由于它最多只能吃掉1.5K内存,但是它们的生存期长些。

net.ipv4.tcp_keepalive_time = 30

当keepalive起用的时候,TCP发送keepalive的频度。
缺省是2小时。

下面贴一个完全的内核优化设置:

引用

net.ipv4.ip_forward = 0

net.ipv4.conf.default.rp_filter = 1

net.ipv4.conf.default.accept_source_route = 0

kernel.sysrq = 0

kernel.core_uses_pid = 1

net.ipv4.tcp_syncookies = 1

kernel.msgmnb = 65536

kernel.msgmax = 65536

kernel.shmmax = 68719476736

kernel.shmall = 4294967296

net.ipv4.tcp_max_tw_buckets = 6000

net.ipv4.tcp_sack = 1

net.ipv4.tcp_window_scaling = 1

net.ipv4.tcp_rmem =4096 87380 4194304

net.ipv4.tcp_wmem =4096 16384 4194304

net.core.wmem_default = 8388608

net.core.rmem_default = 8388608

net.core.rmem_max = 16777216

net.core.wmem_max = 16777216

net.core.netdev_max_backlog = 262144

net.core.somaxconn = 262144

net.ipv4.tcp_max_orphans = 3276800

net.ipv4.tcp_max_syn_backlog = 262144

net.ipv4.tcp_timestamps = 0

net.ipv4.tcp_synack_retries = 1

net.ipv4.tcp_syn_retries = 1

net.ipv4.tcp_tw_recycle = 1

net.ipv4.tcp_tw_reuse = 1

net.ipv4.tcp_mem = 94500000 915000000 927000000

net.ipv4.tcp_fin_timeout = 1

net.ipv4.tcp_keepalive_time = 30

net.ipv4.ip_local_port_range = 1024 65000

下面是一个大略的nginx配置文件:

user www www;

worker_processes 8;

worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 0010000001000000;

error_log /www/log/nginx_error.log crit;

pid /usr/local/nginx/nginx.pid;

worker_rlimit_nofile 204800;

events

{

use epoll;

worker_connections 204800;

}

http

{

include mime.types;

default_type application/octet-stream;

charset utf-8;

server_names_hash_bucket_size 128;

client_header_buffer_size 2k;

large_client_header_buffers 4 4k;

client_max_body_size 8m;

sendfile on;

tcp_nopush on;

keepalive_timeout 60;

fastcgi_cache_path/usr/local/nginx/fastcgi_cache levels=1:2

keys_zone=TEST:10m

inactive=5m;

fastcgi_connect_timeout 300;

fastcgi_send_timeout 300;

fastcgi_read_timeout 300;

fastcgi_buffer_size 64k;

fastcgi_buffers 8 64k;

fastcgi_busy_buffers_size 128k;

fastcgi_temp_file_write_size 128k;

fastcgi_cache TEST;

fastcgi_cache_valid 200 302 1h;

fastcgi_cache_valid 301 1d;

fastcgi_cache_valid any 1m;

fastcgi_cache_min_uses 1;

fastcgi_cache_use_stale error timeout invalid_header http_500;

open_file_cache max=204800 inactive=20s;

open_file_cache_min_uses 1;

open_file_cache_valid 30s;

tcp_nodelay on;

gzip on;

gzip_min_length 1k;

gzip_buffers 4 16k;

gzip_http_version 1.0;

gzip_comp_level 2;

gzip_types text/plainapplication/x-javascript text/css application/xml;

gzip_vary on;

server

{

listen 8080;

server_name backup.aiju.com;

index index.php index.htm;

root /www/html/; #这里的位置很主要,不要写在其它指令里面,我曾经就调试了好久才创造这个问题的

location /status

{

stub_status on;

}

location ~ .\.(php|php5)?$

{

fastcgi_pass 127.0.0.1:9000;

fastcgi_index index.php;

include fcgi.conf;

}

location ~.\.(gif|jpg|jpeg|png|bmp|swf|js|css)$

{

expires 30d;

}

log_format access '$remote_addr- $remote_user [$time_local] \公众$request\"大众 '

'$status $body_bytes_sent \"大众$http_referer\"大众 '

'\公众$http_user_agent\公众 $http_x_forwarded_for';

access_log /www/log/access.log access;

}

}

关于FastCGI的几个指令(http://wiki.nginx.org/NginxChsHttpFcgiModule):

fastcgi_cache_path/usr/local/nginx/fastcgi_cache levels=1:2 keys_zone=TEST:10m inactive=5m;

这个指令为FastCGI缓存指定一个路径,目录构造等级,关键字区域存储韶光和非活动删除韶光。

fastcgi_connect_timeout 300;

指定连接到后端FastCGI的超时时间。

fastcgi_send_timeout 300;

向FastCGI传送要求的超时时间,这个值是指已经完成两次握手后向FastCGI传送要求的超时时间。

fastcgi_read_timeout 300;

吸收FastCGI应答的超时时间,这个值是指已经完成两次握手后吸收FastCGI应答的超时时间。

fastcgi_buffer_size 64k;

指定读取FastCGI应答第一部分须要用多大的缓冲区,一样平常第一部分应答不会超过1k,由于页面大小为4k,以是这里设置为4k。

fastcgi_buffers 8 64k;

指定本地须要用多少和多大的缓冲区来缓冲FastCGI的应答。

fastcgi_busy_buffers_size 128k;

这个指令我也不知道是做什么用,只知道默认值是fastcgi_buffers的两倍。

fastcgi_temp_file_write_size 128k;

在写入fastcgi_temp_path时将用多大的数据块,默认值是fastcgi_buffers的两倍。

fastcgi_cache TEST

开启FastCGI缓存并且为其制订一个名称。
个人觉得开启缓存非常有用,可以有效降落CPU负载,并且防止502缺点。

fastcgi_cache_valid 200 302 1h;

fastcgi_cache_valid 301 1d;

fastcgi_cache_valid any 1m;

为指定的应答代码指定缓存韶光,如上例中将200,302应答缓存一小时,301应答缓存1天,其他为1分钟。

fastcgi_cache_min_uses 1;

缓存在fastcgi_cache_path指令inactive参数值韶光内的最少利用次数,如上例,如果在5分钟内某文件1次也没有被利用,那么这个文件将被移除。

fastcgi_cache_use_stale error timeoutinvalid_header http_500;

不知道这个参数的浸染,猜想该当是让nginx知道哪些类型的缓存是没用的。

以上为nginx中FastCGI干系参数,其余,FastCGI自身也有一些配置须要进行优化,如果你利用php-fpm来管理FastCGI,可以修正配置文件中的以下值:

<value name=\公众max_children\"大众>60</value>

同时处理的并发要求数,即它将开启最多60个子线程来处理并发连接。

<value name=\公众rlimit_files\"大众>102400</value>

最多打开文件数。

<valuename=\公众max_requests\"大众>204800</value>

每个进程在重置之前能够实行的最多要求数。

下面贴几张测试结果图。

静态页面为我在squid配置4W并发那篇文章中提到的测试文件,下图为同时在6台机器运行webbench -c 30000 -t 600 http://backup.aiju.com:8080/index.html命令后的测试结果:

利用netstat过滤后的连接数:

php页面在status中的结果(php页面为调用phpinfo):

php页面在netstat过滤后的连接数:

未利用FastCGI缓存之前的做事器负载:

此时打开php页面已经有些困难,须要进行多次刷新才能打开。
上图中cpu0负载偏低是由于测试时将网卡中断要求全部分配到cpu0上,并且在nginx中开启7个进程分别制订到cpu1-7。

利用FastCGI缓存之后:

此时可以很轻松的打开php页面。

这个测试并没有连接到任何数据库,以是并没有什么参考代价,不过不知道上述测试是否已经到达极限,根据内存和cpu的利用情形来看彷佛没有,但是已经没有多余的机子来让我运行webbench了。

④导致nginx 502 bad gateway的PHP-CGI(FASTCGI)

NGINX频爆502 BAD GATEWAY的缺点,看了网上的教程,仍没有彻底办理。

目前我总结的办理502 BAD GATEWAY的办法有:

1.视做事器的性能,在php-fmp.conf里增加max_children的值,我目前用的15.

2.用reload参数定时重载php-fpm。
这个紧张缘故原由是php脚本实行韶光过长造成的,重载php-fpm能杜绝这个问题。
如何彻底办理php-cgi脚本占用大量内存从而导致502缺点的产生还值得进一步磋商,目前该做法不失落为一种好办法。

详细的做法是,用crontab让php-fpm平滑重启,从而不影响PHP脚本的运行。

/10 /usr/local/php/sbin/php-fpmreload

=================== 优化设置=========================

When you running a highload website with PHP-FPM via FastCGI, thefollowing tips may be useful to you : )

如果您高负载网站利用PHP-FPM管理FastCGI,这些技巧大概对您有用:)

1. Compile PHP’s modules as less aspossible, the simple the best (fast);

1.只管即便少安装PHP模块,最大略是最好(快)的

2. Increas PHP FastCGI child number to 100and even more. Sometime, 200 is OK! ( On 4GB memory server);

2.把您的PHP FastCGI子进程数调到100或以上,在4G内存的做事器上200就可以

注:我的1g测试机,开64个是最好的,建议利用压力测试获取最佳值

3. Using SOCKET PHP FastCGI, and put into/dev/shm on Linux;

3.利用socket连接FastCGI,linux操作系统可以放在 /dev/shm中

注:在php-fpm.cnf里设置<value name=”listen_address”>/tmp/nginx.socket</value>就可以通过socket连接FastCGI了,/dev/shm是内存文件系统,放在内存中肯定会快了.记得这时也要在nginx里的配置里进行修正,保持同等.

location ~ .\.(php|php5)?$

{

#将Nginx与FastCGI的通信办法由TCP改为Unix Socket。
TCP在高并发访问下比Unix Socket稳定,但Unix Socket速率要比TCP快。

fastcgi_pass unix:/tmp/php-cgi.sock;

#fastcgi_pass 127.0.0.1:9000;

fastcgi_index index.php;

include fcgi.conf;

}

4. Increase Linux “max open files”, usingthe following command (must be root):

# echo ‘ulimit -HSn 65536′ >>/etc/profile

# echo ‘ulimit -HSn 65536 >> /etc/rc.local

# source /etc/profile

4.调高linux内核打开文件数量,可以利用这些命令(必须是root帐号)

echo ‘ulimit -HSn 65536′ >> /etc/profile

echo ‘ulimit -HSn 65536′ >> /etc/rc.local

source /etc/profile

注:我是修正/etc/rc.local,加入ulimit -SHn 51200的

5. Increase PHP-FPM open filedescription rlimit:

# vi /path/to/php-fpm.conf

Find “<value name=”rlimit_files”>1024</value>”

Change 1024 to 4096 or higher number.

Restart PHP-FPM.

5. 增加 PHP-FPM 打开文件描述符的限定:

# vi /path/to/php-fpm.conf

找到“<value name=”rlimit_files”>1024</value>”

把1024 变动为 4096 或者更高.

重启 PHP-FPM.

6. Using PHP code accelerator, e.g eAccelerator, XCache. And set “cache_dir” to/dev/shm on Linux.

6.利用php代码加速器,例如 eAccelerator, XCache.在linux平台上可以把`cache_dir`指向 /dev/shm

本文转载地址:http://blog.51cto.com/samfeng/1389591

作者fengyunsen的原创作品