请教一个在 nginx 模块开发遇到的问题 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
aszxqw
V2EX    程序员

请教一个在 nginx 模块开发遇到的问题

  •  
  •   aszxqw
    yanyiwu 2014-09-06 20:33:30 +08:00 4215 次点击
    这是一个创建于 4123 天前的主题,其中的信息可能已经有所发展或是发生改变。
    自己搞了一个项目 https://github.com/aszxqw/ngx_http_cppjieba_module
    但是遇到一个问题。
    这个项目是一个占用内存比较大的项目(因为需要载入词典)。
    现在代码都写完了,已经可以编译部署起来了。
    但是发现现在 master 使用的内存和 worker 使用的内存都一样大。也就是 master 也载入词典,worker 也载入词典。而其实 master 是不需要载入这个词典的。

    我对 nginx 不是很熟悉,写这个项目也只是参考别的模块的代码写着玩玩的。所以这个问题自己就不深究了,在此请教各位。
    16 条回复    2014-09-07 19:21:42 +08:00
    msg7086
        1
    msg7086  
       2014-09-06 21:05:53 +08:00 via iPhone
    Master载入词典以后不就可以给子进程共享了?
    aszxqw
        2
    aszxqw  
    OP
       2014-09-06 21:30:29 +08:00
    @msg7086 我的意思是master 不需要载入词典,worker 去载入词典就好。省的使用两倍的内存。
    aszxqw
        4
    aszxqw  
    OP
       2014-09-06 21:50:23 +08:00
    @SErHo
    似乎不行,编译过不去。
    ```
    /tmp/ngx_http_cppjieba_module/src/ngx_http_cppjieba_module.cpp:121:1: error: invalid conversion from ‘ngx_int_t (*)(ngx_conf_t*) {aka long int (*)(ngx_conf_s*)}’ to ‘ngx_int_t (*)(ngx_cycle_t*) {aka long int (*)(ngx_cycle_s*)}’ [-fpermissive]
    ```
    SErHo
        5
    SErHo  
       2014-09-06 21:53:28 +08:00
    把 static ngx_int_t ngx_http_cppjieba_init(ngx_conf_t *cf) 定义为 static ngx_int_t ngx_http_cppjieba_init(ngx_cycle_t *cycle)
    aszxqw
        6
    aszxqw  
    OP
       2014-09-06 22:25:13 +08:00
    @SErHo 赞!ok 了!
    没想到第一次在 v2ex 提这种技术问题这么快就被解决了。
    非常感谢。
    SErHo
        7
    SErHo  
       2014-09-06 22:33:30 +08:00
    @aszxqw 提个建议:给 CPPJieba 提供一个 C 的接口,然后 Nginx 模块使用 C 编写,这样要好一点。
    aszxqw
        8
    aszxqw  
    OP
       2014-09-06 23:48:34 +08:00
    @SErHo 有道理,不过提供 c 接口的话改动就比较多。以后再说咯。
    msg7086
        9
    msg7086  
       2014-09-07 09:40:24 +08:00
    @aszxqw 我的意思是,如果可以在父进程中载入以后,直接fork的时候传递给子进程的话,不是可以节约更多的内存吗……
    aszxqw
        10
    aszxqw  
    OP
       2014-09-07 11:39:45 +08:00
    @msg7086
    你说的 fork 传递给子进程啥意思? fork 出来的子进程内存是和父进程占用一样大的啊。
    YouXia
        11
    YouXia  
       2014-09-07 13:45:31 +08:00 via Android
    @aszxqw

    应该是这个意思,父子进程使用了COW(copy on write)技术,你加载词典只是读,应该不会有写操作,子进程只会共享父进程的数据,而不会复制到真正的内存地址。
    aszxqw
        12
    aszxqw  
    OP
       2014-09-07 14:08:07 +08:00
    @YouXia
    应该不是这个意思吧。写时拷贝是没错,但是我 top 看实际内存使用确实是占用了两倍,记载的词典是 const,确实是只读,但是可能在socket模块有写操作,就把整个内存拷贝了?
    具体我也没太明白。
    如果能共享同一块内存当然是最好,现在这样多个 worker 应该也是多倍内存使用了,忧伤。
    msg7086
        13
    msg7086  
       2014-09-07 14:47:41 +08:00
    @aszxqw 这么说吧。如果你有个占用内存20M的变量在堆栈上,然后你fork了自己100次。最终这个变量的占用内存还是20M,不会因为你fork了就变成2G的。所有的子进程完全共享同一块内存区域,一直到里面的数据被改变了为止。

    top上显示的不是实际使用内存,而是统计使用内存才对吧。COW内存分页top应该是看不到的。
    aszxqw
        14
    aszxqw  
    OP
       2014-09-07 17:50:24 +08:00
    @msg7086
    恩,好吧,只是我在实际操作中发现 top 还是准的,当我把进程数调高之后,会因为内存不足 fork 不出进程(就是一直被 kill,在阿里云主机上测试的。),可能是我现在的代码逻辑不满足 COW 的条件还是其他原因吧。以后有时间再看看咯。
    msg7086
        15
    msg7086  
       2014-09-07 19:17:29 +08:00
    @aszxqw 关键是你要在父进程中就申请空间,然后再fork,这样子进程里直接使用这块空间就行了。
    aszxqw
        16
    aszxqw  
    OP
       2014-09-07 19:21:42 +08:00
    @msg7086
    你说的这个过程是得改nginx 的 core 源码吧。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2537 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 03:37 PVG 11:37 LAX 19:37 JFK 22:37
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86