nginx性能优化

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值