nginx性能优化
程序员文章站
2022-07-13 09:33:39
...
nginx性能优化
本文通过以下几个方面对nginx进行性能调优
- 优化静态文件获取
- 优化文件压缩
- 优化缓存分配
- 优化工作进程分配
1.优化静态文件获取
1.1 一般情况
location /css
{
sendfile on;
sendfile_max_chunk 1M;
tcp_nopush on;
}
- sendfile on 获取文件跨过用户态。注意,.gzip压缩器需要在用户态进行,因此无法和sendfile共存,如果gizp设置为on,那么sendfile就会失去作用
- sendfile_max_chunk 1M 限制最大sendfile的文件大小,防止过大的文件占据整个工作进程
- tcp_nopush on 返回数据的首个数据包会携带从sendfile中获取大块的数据后才会被发送,这样可以防止网络拥塞问题。
1.2针对大文件获取
- 对于大文件,不适合进行缓存,如果对大文件进行缓存,那么缓存区就无法存储其他数据,缓存就失去了意义。因此,需要通过Direct I/O 命令对数据不进行缓存。
- 举例
location /media
{
sendfile off;
directio 4k;
output_buffers 1 256k;
}
- 由于directio会堵塞工作进程,会降低吞吐量,因此可以开启异步的io——
Asynchronous I/O (AIO)
,如下所示
location /media
{
sendfile off;
directio 4k;
output_buffers 1 256k;
aio on;
}
- 同时可以把aio和directio 与sendfile 结合,得到如下配置
location /media
{
sendfile on;
directio 4k;
output_buffers 1 256k;
aio on;
}
解读一下,当dirctio大于4k的时候启用异步io,当小于4k的时候 使用sendfile。
2 压缩文件
2.1 举例
location /
{
gzip on;
gzip_types text/html text/plain text/css;
gzip_min_length 512;
}
2.2 说明
- gzip on,开启压缩
- gzip_types 指定需要压缩的文件类型,默认为text/html
- gzip_min_length 需要进行压缩的最小文件大小(单位字节),例子中大小为512字节以上的才会进行压缩,对返回数据进行压缩是比较耗cpu的,如果cpu使用率本身就很高,可以使用
gzip_comp_level
调节压缩等级
2.3 压缩率查看
- 通过
$gzip_ratio
变量可以查看压缩率,例如可以在日志格式中添加该变量
http {
log_format gzip
'$remote_addr - $remote_user [$time_local] $status '
'"$request" $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$host" $gzip_ratio';
}
3 优化缓存分配
nginx使用缓存存储请求和返回数据,优化缓存分配可以节约内存空间以及减少cpu的使用。
- 常用的缓存命令有以下几个
,可以看到大部分缓存的命令包含两个参数,一个是number(数量),另外一个是size(大小) -
有三种内存使用的场景,如下图所示
a图 输入数据流小于缓存大小
b图 输入数据大于单个缓存,但比总的缓存要小,可以看到最后一个缓存中有部分空间没有被使用到
- c图 输入数据超过整个缓存大小(极端情况下是所有的缓存都被占据),此时需要等待空的缓存区,这样设计的好处是,对于单个请求,占据的缓存总的大小是固定——缓存数量*单个缓存大小
- 通过这三种使用场景,可以得出,如果缓存设置的太大,那么单个请求根本用不到这么多,浪费了空间;如果缓存设置太小,那么cpu会花费更多的代价在缓存的释放和分配上,因此需要根据实际的使用场景进行调节,没有放之四海而皆准的配置方法。
4 工作进程分配
4.1 问题
- 对于多核cpu,每个核中都有一个tlb缓存,也称为页表缓存,(为了加快虚拟地址到物理地址的转换)。那么可能存在这么一个场景,当操作系统分配一个进程到cpu的某个核中,发现该核的tlb与其虚拟内存的上下文并不相符,那么操作系统会刷新该核的tlb。
4.2 解决办法
- nginx中可以通过设置参数 使得某个进程和相应的cpu核进行关联,使其富有“粘性”。
worker_processes 4;
worker_cpu_affinity 0001 0010 0100 1000;
worker_cpu_affinity
参数,中1代表对应的cpu核。
上一篇: Nginx配置性能优化