欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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的使用。

  • 常用的缓存命令有以下几个
    nginx性能优化,可以看到大部分缓存的命令包含两个参数,一个是number(数量),另外一个是size(大小)
  • 有三种内存使用的场景,如下图所示
    nginx性能优化

    • 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核。