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、网络性能的依赖(转)
关于系统性能优化,推荐一篇不错的博客! 系统优化是一项复杂.繁琐.长期的工作,优化前需要监测.采集.测试.评估,优化后也需要测试.采集.评估.监测,而且是一个长期和持续的过程,不 是说现在优化了,测试 ...
随机推荐
- MySQL 避免使用字符串类型作为标识列
避免使用字符串类型作为标识列: 消耗空间. 比数字类型慢(MyISAM 中对字符串使用压缩索引,查询会慢). 对于 MD5().UUID() 生成的随机字符串,这些值会分布在很大的空间内,导致 ins ...
- Linux 下使用 ffmpeg 大批量合并 ts 文件, mp4切割文件为m3u8
见范例 ffmpeg -i "concat:file001.ts|file002.ts|file003.ts|file004.ts......n.ts" -acodec copy ...
- P & R 8
Floorplan: 要做好floorplan需要掌握哪些知识跟技能? 通常,遇到floorplan问题,大致的debug步骤跟方法有哪些? 如何衡量floorplan的QA? T:Block lev ...
- python关于操作文件的相关模块(os,sys,shutil,subprocess,configparser)
一:os模块 os模块提供了许多允许你程序与操作系统直接交互的功能 功能 说明 os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径 os.chdir("dirna ...
- Hadoop架构: HDFS中数据块的状态及其切换过程,GS与BGS
该系列总览: Hadoop3.1.1架构体系——设计原理阐述与Client源码图文详解 : 总览 首先,我们要提出HDFS存储特点: 1.高容错 2.一个文件被切成块(新版本默认128MB一个块)在不 ...
- Python中的参数解包:`*`表达式和 `**`表达式
目录 1.参数解包:方法调用中的*表达式和**表达式 2.参数解包:方法定义中的*表达式和**表达式 3.在元组,列表,集合和字典中解包 4.Extended Unpacking:赋值表达式左边的*表 ...
- 91云服务器网络带宽测试,IO测试、全国ping测试
91yun服务器测试一键包介绍 一键包主要是为了让大家快速对服务器的基本状况有一个了解.考虑到天朝的网络出口问题,所以这个一键包更加偏向网络的测试. 影响测试耗时主要是下载,整个测试如果是能跑满100 ...
- Sunday算法浅谈
一.Sunday算法简介 Sunday算法在我看来比起Kmp和bm都更加容易理解,代码实现也更加简洁.Sunday算法由Daniel M.Sunday在1990年提出,它的思想跟BM算法很相似只不过S ...
- cookie的封装
今天逛论坛,看到一个看起来写得好的函数,特此贴出分享: 原文地址[http://www.html-js.com/article/2638 ] 这个地址[https://github.com/jaywc ...
- Raid 10配置流程(五块磁盘)
Raid 10配置流程(五块磁盘) 1.在虚拟机中再添加5块硬盘. 2.使用mdadm命令创建raid10,名称为“/dev/md0” -C代表创建操作,-v显示创建过程,-a yes检查RAID名 ...