系统性能优化 - 缓存
缓存架构图
CPU 核心指标
访问时延
core-一级缓存:4-5 个时钟周期
core-二级缓存:12 个时钟周期
core-三级缓存:30 个时钟周期
core-内存:100 个时钟周期
CPU 三级缓存单次加载量
cpu cache line,笔者服务器 64KB
关于 CPU Cache Line 的应用其实非常广泛,如果你用过 Nginx,会发现它是用哈希表来存放域名、HTTP 头部等数据的,这样访问速度非常快,而哈希表里桶的大小如 server_names_hash_bucket_size,它默认就等于 CPU Cache Line 的值。由于所存放的字符串长度不能大于桶的大小,所以当需要存放更长的字符串时,就需要修改桶大小,但 Nginx 官网上明确建议它应该是 CPU Cache Line 的整数倍。
-- 引自《系统性能调优必知必会》
缓存命中率
空间局部性(数据缓存)
CPU 分支预测器(指令缓存)
线程绑定运行核心(sched_setaffinity):减少 CPU 上下文切换
内存分配机制
分配方法:LD_PRELOAD
Ptmalloc2:大内存友好,预分配 64MB,但有锁竞争
TCMalloc:小内存友好,可支撑并发线程多
内存位置
堆内存:空间大,公用,并发分配有锁
栈内存:空间小,线程独享,并发分配无锁,golong 特性
磁盘高速缓存 PageCache
缓存 IO
系统调用:用户态、内核态切换
预读功能:空间局部性
零拷贝
内核提供方法,直接将 PageCache 复制到 Socket 缓冲区等
直接 IO
直接将磁盘文件读取到用户内存空间
异步 IO
不阻塞用户线程,依靠内核回调唤起用户处理线程
有了直接 IO 后,异步 IO 就可以无阻塞地读取文件了。现在,大文件由异步 IO 和直接 IO 处理,小文件则交由零拷贝处理,至于判断文件大小的阈值可以灵活配置(参见 Nginx 的 directio 指令)。
--引自《系统性能调优必知必会》
网络 IO
阻塞 IO
用户线程发起系统调用,数据从硬件空间到内核空间、内核空间到用户空间过程中都阻塞用户线程
非阻塞 IO
用户线程发起系统调用,数据从硬件空间到内核空间过程不阻塞用户线程
普通非阻塞 IO
用户线程需要不断执行系统调用 recvfrom,获取硬件空间某一个准备好的连接
IO 多路复用模型 V1
用户线程需要执行一次系统调用 select 或 poll,获取硬件空间所有准备好的连接( fd 集合)
多路复用主要复用的是通过有限次的系统调用来实现管理多个网络连接
--引自《网络 IO 演变过程》
IO 多路复用模型 V2
用户线程需要执行一次系统调用 epoll,获取硬件空间所有准备好的连接( fd 集合)
level triggered:缺省的工作方式,同时支持 block 和 no-block socket
edge triggered :高速工作方式,只支持 no-block socket
异步 IO
用户线程发起系统调用,数据从硬件空间到内核空间、内核空间到用户空间都不阻塞用户线程
附录
《5 分钟搞懂 Linux 中直接 I/O 原理》
https://cloud.tencent.com/developer/news/406991
《Linux 进程内存布局》
https://blog.csdn.net/tedious/article/details/7193227
《Linux 的网络协议中的网卡缓冲区》
https://blog.csdn.net/lengye7/article/details/87895486
《网络 IO 演变过程》
版权声明: 本文为 InfoQ 作者【彬】的原创文章。
原文链接:【http://xie.infoq.cn/article/a707596972b4ccbe19a5e8d36】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论