linux nginx 进程数,NGINX性能优化

[TOC]

## 查找问题

### nginx timewait过多

> 在高并发短连接的TCP服务器上,当服务器处理完请求后主动正常关闭TCP连接,都会出现TIMEWAIT

> 比如取一个web页面,1秒钟的http短连接处理完业务,在关闭连接之后,这个业务用过的端口会停留在TIMEWAIT状态几分钟,而这几分钟,其他HTTP请求来临的时候是无法占用此端口的

> 当如果NGINX或者PHP-FPM 的TIMEWAIT过多,可以考虑加大连接数、以及开启TCP重用功能

```

netstat -n|grep :80 #nginx tcp状态

netstat -n|grep :9000 # fpm tcp状态

netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'

```

![](https://img.kancloud.cn/99/8f/998f2502a1496dba6bbf7086235ba374_635x70.png)

### mysql sleep过多

> 出现的问题,同nginx一样,采用max_connetions加大,wait_timeout改小

#### 查看TCP进程状态

```

netstat -n|grep :3306

```

#### 查看MYSQL连接状态

```

SHOW FULL PROCESSLIST

```

或者

```

SELECT * FROM information_schema.processlist WHERE `time`>100 ORDER BY TIME DESC

```

> 该方式可以根据条件进行查询,更加灵活

## 1. NGINX释放内存

> 一般linux 跑了一段时间后,buff/cache会急剧增加,导致网站无法访问,这个时候需要写一个脚本,每天晚上进行释放。

> cd /home/www/

> vim clear_cache.sh

```

#!/bin/bash

sync

echo 1 > /proc/sys/vm/drop_caches

echo 2 > /proc/sys/vm/drop_caches

echo 3 > /proc/sys/vm/drop_caches

echo "清理结束"

```

> chmod 777 clear_cache.sh

> vim /etc/crontab

```

0 8 * * * root /home/www/clear_cache.sh

```

## 2. 修改worker进程数

> 一般为cpu数的1~2倍

> vim nginx.conf

```

# worker进程数这里设置的2倍

worker_processes 4;

# worker进程分配到对应的cpu方式改为auto自动化,nginx1.9之后支持auto

worker_cpu_affinity auto;

```

## 3. nginx优化配置

> A)`worker_connections`:单个worker进程最大连接数

> B) `worker_rlimit_nofile`:单个worker进程的最大打开文件数,(修改的同时系统环境下的ulimit -n 需要大于此值,不然容易报`too many open files`)

> C) `keepalive_timeout`:连接超时时间,(http1.1出了一个保持tcp连接复用,供其他的静态资源可以复用之前打开的连接资源,尽可能设置小,建议为1分钟,这样不会导致TCP的长期间waiting)

> D) `limit_conn perserver`:限制当前站点最大并发数

> E) `limit_conn perip`:限制单个IP访问最大并发数

> F) `limit_rate`:限制每个请求的流量上限(单位:KB)

> `vim /etc/security/limits.conf`,可通过`ulimit -a`查看是否生效

> 如果不是1048576 (默认1024),需进行修改

~~~

# 该方式每次重启就会失效,记得再次设置

ulmint -n 1048576

~~~

或者

```

vim /etc/security/limits.conf

root soft nofile 1048576

root hard nofile 1048576

* soft nofile 1048576

* hard nofile 1048576

```

![](https://img.kancloud.cn/c0/41/c041bfbcb919e42096be3de7013c2f6a_692x486.png)

![](https://img.kancloud.cn/73/83/738346214c1e71646e7fc484f1ca2a10_623x574.png)

## 4. php-fpm优化配置

### 开启慢日志

> slowlog:慢日志路径

> request_slowlog_timeout:超时时间(秒)

### 进程优化

> max_children:允许创建的最大子进程数

> start_servers:起始进程数(服务启动后初始进程数量)

> min_spare_servers:最小空闲进程数(清理空闲进程后的保留数量)

> max_spare_servers:最大空闲进程数(当空闲进程达到此值时清理)

> 本文采用的是动态进程模式,内存开支小,稳定;静态模式对内存开销较大,但并发能力较好,本文没有涉及

> 每个PHP子进程需要20MB左右内存,过大的max_children会导致服务器不稳定

![](https://img.kancloud.cn/40/19/4019b036a1ef618c4f662a639cbff525_496x478.png)

## 5. 系统层面进行调优

> `vim /etc/sysctl.conf`

```

net.core.somaxconn = 65535 #最大tcp监听连接数,默认128

net.core.netdev_max_backlog = 20000 #每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目,默认1000

net.ipv4.tcp_max_syn_backlog = 16384 #记录的那些尚未收到客户端确认信息的连接请求的最大值,默认为1024

net.ipv4.tcp_max_tw_buckets = 180000 #TIME_WAIT的最大数量(尽量调大),超出的部分会被关闭掉,并且日志记录报错信息

net.ipv4.tcp_fin_timeout = 15 # 表示如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间,默认60

net.ipv4.tcp_max_orphans = 131072 #该参数用于设定系统中最多允许存在多少TCP套接字不被关联到任何一个客户文件句柄上,假如超过这个数字,没有与客户文件句柄关联到TCP套接字将立即被复位,同时发出警告信息,这个限制只是为了简单防治Dos攻击,一般系统内存充足的情况下,可以增大这个参数,默认32768

net.ipv4.tcp_tw_reuse = 1 #开启TIME-WAIT(空闲TCP)重用

net.ipv4.tcp_tw_recycle = 0 # (空闲TCP快速回收)不建议开启,如果tcp_tw_recycle和tcp_timestamps同时开启,服务器或者客户机网络处于NAT情况下,网络会经常被断开;

net.ipv4.tcp_syncookies = 0 #不做TCP洪水抵御

net.ipv4.tcp_timestamps = 1 # 记录TCP连接的最新时间戳

```

> `sysctl -p` 使其生效

> 为了以防tcp_timestamps、tcp_tw_recycle同时开启,建议查看系统参数是否生效

~~~

cat /proc/sys/net/ipv4/tcp_timestamps

cat /proc/sys/net/ipv4/tcp_tw_recycle

cat /proc/sys/net/ipv4/tcp_tw_reuse

~~~

## 6. 进参数进行测试

> 使用ab进行测试

```

ab -c 1000 -n 1000000 http://www.test.com/test.html

```

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值