Nginx内存对齐优化
来源:互联网 发布:美国新屋开工数据 编辑:程序博客网 时间:2024/06/11 20:06
Nginx内存对齐优化
Nginx在内存使用方面做了较多优化,其中有一项就是内存对齐。内存对齐都有哪些好处?单从Nginx的代码来看,有两点:
- 减少CPU访问内存次数,我们知道CPU都有一个叫做总线宽度的东西,我们平时所说的32位CPU,其实就是它的总线宽度是32位,也就是一次能读32/8=4个字节。假设有一块内存地址为0 1 2 3 4 5 6 7八个字节,CPU从该内存中读一个整数出来,如果该整数占据着 0 1 2 3四个字节,则CPU可以一次读出;如果该整数占据着 2 3 4 5,则CPU需要读两次内存,这样看来变量在内存中的布局会影响到CPU访问内存的次数,如果该变量访问很频繁的话,比如应用系统中访问量很大的缓存数据,该程序就有优化的空间。
- 列表内容尽量与CPU缓存字或者系统内存页块对齐,能占用一个缓存条目的不占据两条,这样能提高高速缓存的利用率,我们可以看到Nginx中运行时频繁使用的crc32表数据就考虑了CPU高速缓存字对齐。src/core/ngx_cpuinfo.c有获取各种类型CPU高速缓存条目的代码。src/os/unix/ngx_posix_ini.c的函数ngx_os_init中有获取操作系统缓存页大小的代码。
下面来看一下Nginx获取对齐内存地址的方法:
#define ngx_align(d, a) (((d) + (a - 1)) & ~(a - 1))
这个宏本质上是计算大于d的a的最小倍数。一般来说a是2的幂运算。比如说a=8,也就是一个字节对齐,a-1二进制形式就是0111。根据d的值,会有两种情况出现:
1)当d是a的整数倍时,其最低三位都是0,加上a-1,最低三位就变成全1,然后与~(a - 1)按位与后最低又三位变成全0,高于3位的部分未变,所以当d是a的整数倍时,ngx_align(d, a)等于d。
2)当d不是a的整数倍时,由于d的低三位有1出现,加上0111后第四位会进一,当和~(a - 1)与运算后低三位变为全0,这样就是a的整数倍了,高于低三位的部分获得了一个进位,所以刚好是大于d的a的最小倍数。
阅读全文
0 0
- Nginx内存对齐优化
- Nginx内存对齐优化
- nginx中内存对齐调用的函数
- nginx源码分析--内存对齐处理
- Nginx基础. Nginx中内存地址对齐(转)
- Nginx中发现的一个内存对齐宏定义
- 小内存VPS优化-nginx,php,mysql
- TCMalloc优化MySQL、Nginx、Redis内存管理
- jemalloc优化MySQL、Nginx内存管理
- TCMalloc优化MySQL、Nginx、Redis内存管理
- 关键字 对齐 内存对齐
- 使用MSVC进行SSE2优化时内存对齐的方法
- 内存对齐
- 内存对齐
- 内存对齐
- 内存对齐
- 内存对齐
- 内存对齐
- pdf文件怎么编辑?我又学到了一招!
- 远程唤醒(待验证)
- 卢俊卿谈爱让城市充满幸福
- poj1265-Area 皮克定理(求多边形的面积,内部的点数,边上的点数)
- 分享一个项目中用到的简单的id生成工具
- Nginx内存对齐优化
- java调用webservice的四种方式
- 06构建一个数据库测试
- windows 2008 命令行 控制 防火墙 入站 出站 规则
- Redis Sentinel机制与用法说明
- 在lua环境中使用protobuf
- 在IntelliJ idea中使用fiddler捕获Web请求
- 事务无法回滚(mysql数据库存储引擎问题)
- javaSE_8系列博客——重要的基础Java类——多线程--2--进程和线程