nginx-0x0C-系统时间
系统时间缓存的必要性以及整套配合机制在nginx-0x0A-定时器已经提过。这篇介绍的是系统时间到底是咋缓存的。
首先年月日时分秒结构化的时间肯定是通用的,但是有些场景对时间单调性有严格要求。
1 获取时间的系统调用
系统调用\比较 | gettiemofday | clock_gettime |
---|---|---|
格式 | 结构化绝对时间,系统时间,墙上时间 | 相对时间,相对系统开机时长 |
精度 | 微秒 | 纳秒 |
2 关于时间格式
上面已经介绍了两种时间格式
- 结构化时间
- 单调相对时间
因此在nginx中就维护了这两种格式的全局变量
- static ngx_time_t cached_time[NGX_TIME_SLOTS];
- volatile ngx_msec_t ngx_current_msec;
3 关于性能的考量
对于缓存,有更新的地方,有读取使用的地方。为了保障公共资源的安全性,采用锁保护是最简单的方式,关于怎么加锁
- 读写都要加锁,共用一把锁,这种方式实现最简单,性能最差
- 读写都要加锁,读写锁分离,这种方式稍微复杂,但是对于高性能服务器上高吞吐的读是接受不了的
- 只要求写加锁,读无锁化,这种方式实现起来最难,性能最高
4 为什么同样是缓存一个是单值变量一个是数组
读写解耦的情况下,想象有个无限长度的数组,写有写指针,读有读指针,写就永远不用担心读的数据被污染和安全问题。
但是不可能有无限空间这一说,环形数组就是有有限空间模拟无限存储的过程,既然是数组就要考虑数组长度,过短和过长都不行,nginx默认用长度64的数组来缓存时间。
1 |
|
4.1 结构化时间格式
1 |
|
4.2 单调时间
1 |
|
这就是结构化时间用环形数组缓存,而单调时间用整数缓存的原因。
5 关于读写解耦
在环形数组上用读写指针方式保证读写操作分离,写用锁保证资源互斥,读用无锁保证性能。
5.1 读
1 |
|
5.2 写
写指针,这个数组指针只留给写操作使用的。
1 |
|
在更新时间内部有个小细节,我觉得值得学习,高性能软件开发中总能看到很多小技巧小细节
1 |
|
nginx-0x0C-系统时间
https://bannirui.github.io/2025/04/09/nginx/nginx-0x0C-系统时间/