搜索
首页运维Nginxnginx中的共享内存如何使用

nginx中的共享内存如何使用

May 14, 2023 pm 03:55 PM
nginx

ngx_shmem的使用

ngx_shmem.c/h文件只是对mmap()/munmap()系统调用或者shmget()/shmdt()的一个很简单的封装。实现了ngx风格的基础库,可以申请和释放一段连续的共享内存空间。一般用于固定长度的共享数据使用,使用过程中数据长度固定不会伸缩。

typedef struct {
  u_char   *addr;
  size_t    size;
  ...
} ngx_shm_t;
ngx_int_t ngx_shm_alloc(ngx_shm_t *shm);
void ngx_shm_free(ngx_shm_t *shm);

在ngxin中共享内存的使用流程,一般是由master进程创建,worker进程通过继承的方式获得内存指针。

关于ngx_shmem的使用,可以参考ngx_event_module_init()中部分片段,这部分代码在共享内存中创建了若干个变量,用于记录各个状态(accepted/reading/writing...)的请求数量,并在ngx_event_module中的几个关键事件入口对这几个变量进行加减统计操作。实现统计所有worker进程当前的请求状态。

shm.size = size;
ngx_str_set(&shm.name, "nginx_shared_zone");
shm.log = cycle->log;

if (ngx_shm_alloc(&shm) != ngx_ok) {
  return ngx_error;
}

shared = shm.addr;
...
ngx_stat_accepted = (ngx_atomic_t *) (shared + 3 * cl);
ngx_stat_handled = (ngx_atomic_t *) (shared + 4 * cl);
ngx_stat_requests = (ngx_atomic_t *) (shared + 5 * cl);
ngx_stat_active = (ngx_atomic_t *) (shared + 6 * cl);
ngx_stat_reading = (ngx_atomic_t *) (shared + 7 * cl);
ngx_stat_writing = (ngx_atomic_t *) (shared + 8 * cl);
ngx_stat_waiting = (ngx_atomic_t *) (shared + 9 * cl);

关于这个功能的更多细节,可以查看代码中的ngx_stat_stub宏定义相关代码与ngx_http_stub_status_module。

ngx_slab的使用

ngx_shmem是一层极简的封装,实现了共享内存的基本功能。但我们程序中大部分的场景共享数据并不会一个固定大小的结构,而更多是像ngx_array、ngx_list、ngx_queue、ngx_rbtree这类大小可以变化的数据结构。

我们期望能有像ngx_pool_t一样可以动态申请释放空间一个内存池。ngx_slab正是一个这样的结构体,原理上与系统的malloc()有相识之处都是通过一系列算法实现对一段段内存片段的申请与释放。只不过ngx_slab操作的对象是基于ngx_shmem的共享内存。

先看一下ngx_slab的接口

typedef struct {
  ngx_shmtx_t    mutex;
  ...
  void       *data; /* 一般存放从pool中申请获得的根数据地址(pool中第一个申请的数据接口) */
  void       *addr; /* 使用ngx_shmem申请获得的共享内存基地址 */
} ngx_slab_pool_t;

void ngx_slab_init(ngx_slab_pool_t *pool);
void *ngx_slab_alloc(ngx_slab_pool_t *pool, size_t size);
void *ngx_slab_alloc_locked(ngx_slab_pool_t *pool, size_t size);
void *ngx_slab_calloc(ngx_slab_pool_t *pool, size_t size);
void *ngx_slab_calloc_locked(ngx_slab_pool_t *pool, size_t size);
void ngx_slab_free(ngx_slab_pool_t *pool, void *p);
void ngx_slab_free_locked(ngx_slab_pool_t *pool, void *p);

可以看到接口并不复杂,alloc与calloc的区别在于是否对申请获得的内存段清零,_locked结尾的接口表示操作的pool已经是获取到锁的。在ngx_slab_pool_t的结构体有一个ngx_shmtx_t的互斥锁用于同步多进程同时访问pool的并发场景。注意ngx_slab_alloc()会先获取锁、然后申请空间、最后释放锁。而ngx_slab_alloc_locked()则直接申请空间,认为程序已经在其他逻辑中获得锁了。

在nginx的开发中使用ngx_shmem一般需要遵循以下初始化流程:

  • 模块在配置解析过程中调用ngx_shared_memory_add()接口,注册一段共享内存。提供共享内存大小与内存初始化的回调函数。

  • 框架在ngx_init_cycle()中使用ngx_shmem申请内存,并初始化ngx_slab,然后回调模块注册的初始化函数

  • 模块使用ngx_slab的申请/是否接口

在这个流程中,涉及到ngx_shared_memory_add()接口与对应的ngx_shm_zone_t结构体。

struct ngx_shm_zone_s {
  void           *data;
  ngx_shm_t         shm;
  ngx_shm_zone_init_pt   init;
  void           *tag;
  void           *sync;
  ngx_uint_t        noreuse; /* unsigned noreuse:1; */
};
ngx_shm_zone_t *ngx_shared_memory_add(ngx_conf_t *cf, ngx_str_t *name,
  size_t size, void *tag);

其中值得一提的是noreuse属性,这个属性控制了在nginx的reload过程中是否会重新申请共享内存。

由于关于ngx_init_cycle()函数较长,这个流程可以通过查找/* create shared memory */这个注释或者cycle->shared_memory这个对象查看相关代码。

以上是nginx中的共享内存如何使用的详细内容。更多信息请关注PHP中文网其他相关文章!

声明
本文转载于:亿速云。如有侵权,请联系admin@php.cn删除
雷军分享新年愿望:交付30万辆车、健身房打卡100次雷军分享新年愿望:交付30万辆车、健身房打卡100次Apr 13, 2025 pm 11:54 PM

新年伊始,雷军抖音跨年直播分享了2025年的三个新年愿望,这场长达四个半小时的直播吸引了众多关注。雷军的三大愿望分别是:第一,实现30万辆汽车交付目标,缓解压力,不再被进度追赶。第二,拥有更多旅行时间,欣赏各地美景、品尝特色美食,并结合工作进行汽车测试。第三,坚持健身,计划在健身房打卡100次,强身健体。雷军在直播中坦言,2024年奔波于各地,行程安排紧凑,往往只能短暂停留,难以深入体验当地文化。例如,在德国纽北赛道,他仅停留了8个小时。因此,在新的一年里,他希望能够更好地平衡工作与生活,在旅行

年度口碑佳作!九号公司微电影《记忆奇旅》荣膺多项权威大奖年度口碑佳作!九号公司微电影《记忆奇旅》荣膺多项权威大奖Apr 13, 2025 pm 11:51 PM

九号公司携手品牌代言人易烊千玺打造的微电影《记忆奇旅》,在2024年荣获多项权威媒体大奖,成为年度口碑佳作。这部作品以独特的叙事风格、精湛的制作和真挚的情感,赢得了业界的高度赞誉。2024年度获奖荣誉:2024金触点全球商业创新大奖-年度影视广告2024中国广告营销大奖-娱乐营销组银奖2024TopDigital创新营销奖-影视制作类金奖2024上海国际广告节-微电影银奖2024第十一届中国创新传播大奖-整合营销类银奖WISE2024商业之王-年度案例第31届中国国际广告节2024数字营销实战大

创新引领,再获殊荣!AGON斩获PConline2024智臻科技奖创新引领,再获殊荣!AGON斩获PConline2024智臻科技奖Apr 13, 2025 pm 11:48 PM

近日,PConline2024智臻科技奖正式揭晓,AGON爱攻QD-OLED电竞显示器AG326UD荣获“年度技术创新”奖项。此项殊荣不仅代表了业界对其技术优势与市场表现的高度认可,更充分体现了AGON爱攻在电竞显示器技术领域的创新能力和卓越成就。01.瞰科技未来,品技术革命PConline智臻科技奖的权威含金量作为科技行业的风向标,PConline智臻科技奖凭借其严谨的评审体系和深度的行业分析,成功赢得广泛的行业认可。该奖项始终致力于表彰推动科技行业发展的优秀产品和品牌,涵盖从技

索尼证实PS5 Pro使用特制GPU 与AMD合作研发AI可能性索尼证实PS5 Pro使用特制GPU 与AMD合作研发AI可能性Apr 13, 2025 pm 11:45 PM

SonyInteractiveEntertainment(SIE,索尼互动娱乐)首席架构师MarkCerny公开更多次世代主机PlayStation5Pro(PS5Pro)硬体细节,包括性能升级的AMDRDNA2.x架构GPU,以及与AMD合作代号「Amethyst」的机器学习/人工智慧计划。 PS5Pro性能提升的重点仍集中在更强大的GPU、先进的光线追踪与AI驱动的PSSR超解析度功能等3大支柱上。 GPU采用客制化的AMDRDNA2架构,索尼将其命名为RDNA2.x,它拥有部分RDNA3架构才

终于改了!微软Windows搜索功能将迎来全新更新终于改了!微软Windows搜索功能将迎来全新更新Apr 13, 2025 pm 11:42 PM

微软针对Windows搜索功能的改进,目前已在欧盟地区部分WindowsInsider频道展开测试。此前,整合后的Windows搜索功能饱受用户诟病,体验欠佳。此次更新将搜索功能拆分为本地搜索和基于Bing的网络搜索两部分,以提升用户体验。新版搜索界面默认进行本地文件搜索,如需进行网络搜索,需点击“MicrosoftBingWebSearch”标签进行切换。切换后,搜索栏将显示“MicrosoftBingWebSearch:”,用户可在此输入关键词。此举有效避免了本地搜索结果与Bing搜索结果混

熟练地烤好了!怪物猎人推出20周年烤肉计时器与暖水壶熟练地烤好了!怪物猎人推出20周年烤肉计时器与暖水壶Apr 13, 2025 pm 11:39 PM

为庆祝卡普空《怪物猎人》系列20周年,宝岛社推出了一款别具匠心的杂志套装——《怪物猎人》主题烧烤计时器及随行杯。该套装将于12月27日在日本全国全家便利店发售,售价3498日元。这款杂志套装最大的亮点在于其互动式烧烤计时器,完美复刻了系列游戏中的经典烧烤场景。计时器采用旧版烤肉工具的设计,配有LED火焰灯效和游戏BGM,让您在实际烧烤过程中也能体验到狩猎的乐趣。旋转手柄模拟翻转烤肉,成功烤熟后更会播放“烤好了!”的语音提示。计时器尺寸约为9.5cm(高)x10.7cm(宽)x8cm(深),内置L

太懂用户了!小米SU7车主可免费领Are U OK气门芯帽太懂用户了!小米SU7车主可免费领Are U OK气门芯帽Apr 13, 2025 pm 11:36 PM

小米汽车一周年庆典,为车主送上新年大礼!继去年交付量突破13万辆后,小米汽车官方微博宣布,将为每位小米SU7车主及准车主赠送雷军经典语录“AreyouOK?”主题气门芯帽,数量有限,免费领取!活动时间:2024年12月28日下午4点至2025年1月20日23:59:59。在2024年12月31日23:59:59前购车或完成订单的用户,即可免费获得一套四件套“AreyouOK?”气门芯帽。这款气门芯帽于今年9月首发,采用亮黄色PVC和黄铜材质制成,黄铜芯直接嵌入,确保行驶安全,不易脱落。用途广泛,

HDMI 2.2标准有望2025前夕公布!8K分辨率即将到来HDMI 2.2标准有望2025前夕公布!8K分辨率即将到来Apr 13, 2025 pm 11:33 PM

据报道,HDMI2.2标准有望在2025年CES展会前夕正式发布,HDMIForum计划于1月6日公布这一新一代视频信号传输协议规范。2017年发布的HDMI2.1标准,最大带宽为48Gbps,支持4K144Hz和8K30Hz视频传输,结合DSC技术最高可达10K120Hz。预计HDMI2.2将大幅提升带宽,支持更高分辨率和刷新率,并采用新型线材。虽然具体规格尚未公开,但HDMI2.2势必超越HDMI2.1的48Gbps带宽和10240*4320分辨率限制。鉴于DisplayPort2.1在20

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
3 周前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
3 周前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
3 周前By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解锁Myrise中的所有内容
4 周前By尊渡假赌尊渡假赌尊渡假赌

热工具

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )专业的PHP集成开发工具

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

适用于 Eclipse 的 SAP NetWeaver 服务器适配器

适用于 Eclipse 的 SAP NetWeaver 服务器适配器

将Eclipse与SAP NetWeaver应用服务器集成。

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

VSCode Windows 64位 下载

VSCode Windows 64位 下载

微软推出的免费、功能强大的一款IDE编辑器