nginx 的磁盘IO优化
磁盘IO优化的几个方面
优化读取
适用于大文件的直接IO
当磁盘文件超过size大小之后,使用directIO功能,避免Buffered IO模式下磁盘页缓存中的拷贝消耗
Syntax: directio size | off; #配置文件最大后表示大于大小
Default: directio off;
Context: http, server, location Syntax: directio_alignment size; 读取文件缓冲区
Default: directio_alignment 512;
Context: http, server, location
异步IO
普通IO:当程序发起一个系统调用去读一个文件时,程序这时会被阻塞住等待读取到文件再次执行,这是先到内核空间发起一个read请求,开始去读磁盘数据,读到高速缓存(内存)里,这时唤醒进程继续执行;写的时候是直接写到高速缓存(内存)里,之后自动同步
异步IO: 当用户发起一个读操作时,程序不会被阻塞在哪里,可以去处理其他请求

nginx指令启用异步IO
Syntax: aio on | off | threads[=pool]; # 最后这个是线程池;调应的
Default: aio off;
Context: http, server, location Syntax: aio_write on | off; #设置写时启用AIO;默认是关闭的;
Default: aio_write off;
Context: http, server, location
异步IO线程池的定义,默认未编译--with-threads
线程池:worker进程在处理时,有一些请求可能会发生一些阻塞,这是我们就不能接受worker进程的阻塞,而是在worker进程里定义一些线程池,由线程池里的线程处理这些可能发生系统阻塞的工作;为什么会出现这样的场景呢:因为nginx在做静态资源服务器的时候,处理了太多的文件,因为处理文件太多,会导致文件缓存的inode失效,因为内存不够大而导致的,一些操作大部分情况下会命中内存中缓存的。

定义线程池
Syntax: thread_pool name threads=number [max_queue=number]; #在静态服务的情况下使用线程池
Default: thread_pool default threads=32 max_queue=65536; # max_queue是定义队列最大长度;threads=32 线程池里线程个数
Context: main
异步IO中缓存
Syntax: output_buffers number size;
Default: output_buffers 2 32k;
Context: http, server, location
empty_gif 模块默认是编译进nginx中的
ngx_http_empty_gif_module
功能:从前端用户做用户行为分析时,由于跨域等请求,前端打点的上报数据是get请求,且考虑到浏览器接卸DOM树的性能消耗,所以请求透明图片消耗最小,而1*1的gift图片体积最小(仅43字节),故通常请求gif图片,并在请求中把用户行为信息上报服务器;Nginx可以在access日志中获取到请求参数,进而统计用户行为,但若在磁盘中读取1x1的文件有磁盘IO消耗,empty_gif模块将图片放在内存中,加速了处理速度
Syntax: empty_gif;
Default: —
Context: location
记录日志时启用压缩功能
Syntax: access_log path [format [buffer=size] [gzip[=level]] [flush=time][if=condition]]; #[buffer=缓存大小][gzip[=压缩比例可选1-9,数字越大压缩的越小,话的时间越多]] [flush=最长刷新时间]
Default: access_log logs/access.log combined;
Context: http, server, location, if in location, limit_except
error.log 日志内容输出到内存中
场景:开发环境下定位,若需要打开debug级别日志,但大量的debug日志引发性能问题不能容忍,可以将日志输出到内存中
配置语法
error_log memory:32m debug;
查看中日志方法
gdb-p[worker 进程 ID ] -ex "source nginx.gdb" --batch nginx.gdb脚本内容
set $log = ngx_cycle->log
while $log->writer != ngx_log_memory_writer
set $log = $log->next
end
set $buf = (ngx_log_memory_buf_t *) $log->wdata
dump binary memory debug_log.txt $buf->start $buf->end
syslog协议


应用程序普通调用:应用程序先发起一个读请求,从磁盘读到内核再从内核读到应用程序缓存里,然后程序再把缓存里的数据写到内核的socket缓冲再进行发送
sendfile技术:程序程序只发起一个sendfile 的调用,告诉内核我要把磁盘数据从哪里开始读读取多少字节,然后把读到的数据发送到那个socket套接字上
直接IO会禁用sendfile技术
location /video/ {
sendfile on;
aio on;
directio 8m;
}
当文件大小超过8M时,启用AIO与directio
Syntax: gzip_static on | off | always; #不管客户端是否支持压缩我都把压缩文件发给客户端always ;on是会判断客户端是否会支持压缩
Default: gzip_static off; Context: http, server, location
gunzip : 模块ngx_http_gunzip_module,通过--with-http_gunzip_module启用该模块
功能:当客户端不支持gzip压缩时,且磁盘上仅有压缩文件,则实时解压缩并将其发送给客户端
Syntax: gunzip on | off;
Default: gunzip off;
Context: http, server, location Syntax: gunzip_buffers number size; #打开内存缓存区
Default: gunzip_buffers 32 4k|16 8k;
Context: http, server, location
wget https://github.com/gperftools/gperftools/releases/download/gperftools-2.7/gperftools-2.7.tar.gz
[root@python ]# tar xf gperftools-2.7.tar.gz
[root@python ]# cd gperftools-2.7/
[root@python gperftools-2.7]# ./configure
[root@python gperftools-2.7]# make && make install
查看生成库文件路径/usr/local/lib/
ll /usr/local/lib/libtcmalloc.so
nginx 的磁盘IO优化的更多相关文章
- KVM总结-KVM性能优化之磁盘IO优化
前面讲了KVM CPU(http://blog.csdn.net/dylloveyou/article/details/71169463).内存(http://blog.csdn.net/dyllov ...
- kvm磁盘io优化以及性能测试以及与物理机对比
ubuntu下kvm的磁盘io性能优化步骤 1.virsh shutdown wcltest2 2.virsh edit wcltest2 <driver name='qemu' type='q ...
- MySQL 调优基础(四) Linux 磁盘IO
1. IO处理过程 磁盘IO经常会成为系统的一个瓶颈,特别是对于运行数据库的系统而言.数据从磁盘读取到内存,在到CPU缓存和寄存器,然后进行处理,最后写回磁盘,中间要经过很多的过程,下图是一个以wri ...
- 【好书摘要】性能优化中CPU、内存、磁盘IO、网络性能的依赖
系统优化是一项复杂.繁琐.长期的工作,优化前需要监测.采集.测试.评估,优化后也需要测试.采集.评估.监测,而且是一个长期和持续的过程,不 是说现在优化了,测试了,以后就可以一劳永逸了,也不是说书本上 ...
- 降低磁盘IO使Oracle性能优化(转)
文章转自:http://blog.chinaunix.net/uid-26813519-id-3207996.html 硬件方面虽然只占Oracle性能优化的一个方面(另一方面是软件),但是仍不可忽视 ...
- linux性能优化cpu 磁盘IO MEM
系统优化是一项复杂.繁琐.长期的工作,优化前需要监测.采集.测试.评估,优化后也需要测试.采集.评估.监测,而且是一个长期和持续的过程,不 是说现在优化了,测试了,以后就可以一劳永逸了,也不是说书本上 ...
- nagios监控mysql主机,nginx,磁盘IO,网卡流量
http://blog.chinaunix.net/uid-28685162-id-3506260.html nagios安装完成,打开/usr/local/nagios/etc/nagios.cfg ...
- 分布式监控系统Zabbix-3.0.3-完整安装记录(3)-监控nginx,php,memcache,Low-level discovery磁盘IO
前段时间在公司IDC服务器上部署了zabbix3.0.3监控系统,除了自带的内存/带宽/CPU负载等系统资源监控模板以及mysql监控模板外,接下来对诸如nginx.php.memcache.磁盘IO ...
- 性能优化中CPU、内存、磁盘IO、网络性能的依赖(转)
关于系统性能优化,推荐一篇不错的博客! 系统优化是一项复杂.繁琐.长期的工作,优化前需要监测.采集.测试.评估,优化后也需要测试.采集.评估.监测,而且是一个长期和持续的过程,不 是说现在优化了,测试 ...
随机推荐
- Android 获取手机的厂商、型号、Android系统版本号、IMEI、当前系统语言等工具类
最近在开发中,需要用到一些系统信息,这里我把这些方法写成一个工具类方便以后复用,该工具类有以下6个功能: 1.获取手机制造厂商 2.获取手机型号 3.获取手机系统当前使用的语言 4.获取Android ...
- C语言运算符优先级和结合性一览表
所谓优先级就是当一个表达式中有多个运算符时,先计算谁,后计算谁.这个其实我们在小学学算术的时候就学过,如1+4÷2. 但是C语言中的运算符已经远不止四则运算中的加减乘除了,还有其他很多运算符.当它们出 ...
- SOCV/POCV 开篇 (1)
1.功能:模拟工艺偏差对芯片性能的影响 2. 40nm之前 flat derate模型可以基本覆盖大部分情况 3.AOCV (Adance OCV) 考虑distance 和depth的影响. AOC ...
- Dart语言学习(五)Dart Bool类型
Dart Bool类型和其他语言类似,比较简单 其特点有: 1.使用 bool 表示布尔类型 2.布尔值只有 true 和 false 3.布尔类型bool默认值是null bool isTrue = ...
- Java中正负数的存储方式-正码 反码和补码
Java中正负数的存储方式-正码 反码和补码 正码 我们以int 为例,一个int占用4个byte,32bits 0 存在内存上为 00000000 00000000 00000000 0000000 ...
- opencv:Mat对象
Mat对象:图像文件的内存数据对象 读取为 Mat 对象 读取图像位Mat对象,获取图像的相关信息 #include <opencv2/opencv.hpp> #include <i ...
- Spring Boot 编辑器 IDEA 免费许可申请
最近 IDEA 陆续到期(试用版)听说可以申请开源许可,试试吧. 点击 https://www.jetbrains.com/shop/eform/opensource?product=ALL 填写相关 ...
- Linux 服务器作为Nginx web服务器常见优化参数
内核参数调整cat /etc/sysctl.conf# sysctl settings are defined through files in # /usr/lib/sysctl.d/, /run/ ...
- CF-----Pillars
. Pillars There are n pillars aligned in a row and numbered from 1 to n. Initially each pillar conta ...
- python 读取一个文件夹下的所jpg文件保存到txt中
最近需要使用统计一个目录下的所有文件,使用python比较方便,就整理了一下代码. import os def gci(filepath): files = os.listdir(filepath) ...