我在gwan上遇到了一个关于回复请求的问题,当我调用函数xbuf_xcat(get_reply(argv), replycontent)时,RSS值不断上升。如果我评论这个函数或更改为xbuf_xcat(get_reply(argv), "value=1"),这种奇怪的现象就不会发生。。。
根20365 0.5 0.8 403848 6468 pts/0 Sl+15:07 0:00 |/opt/gwan/gwan
根20365 0.5 0.8 403848 6488 pts/0 Sl+15:07 0:00 |/opt/gwan/gwan
根20365 0.5 0.8 403848 6492 pts/0 Sl+15:07 0:00 |/opt/gwan/gwan
根20365 0.5 0.8 403848 6496 pts/0 Sl+15:07 0:00 |/opt/gwan/gwan
根20365 0.5 0.8 403848 6500 pts/0 Sl+15:07 0:00 |/opt/gwan/gwan
根20365 0.5 0.8 403848 6504 pts/0 Sl+15:07 0:00 |/opt/gwan/gwan
根20365 0.6 0.8 403848 6504 pts/0 Sl+15:07 0:00 |/opt/gwan/gwan
根20365 0.6 0.8 403848 6528 pts/0 Sl+15:07 0:00 |/opt/gwan/gwan
(如果我连夜运行它,会消耗将近1GB的内存…)
知道吗??
我修改的代码:

xbuf_t *reply = get_reply(argv);
xbuf_t f;
xbuf_init(&f);
xbuf_cat(&f,replycontent);
xbuf_ncat(reply, f.ptr, f.len);
xbuf_free(&f);

下面是代码内容:(我只是不使用我编写的函数,但是RSS仍然每7-10秒上升一次)
int main(int argc, char *argv[]){
    printf("G-wan start Serving...\n");
    char replycontent[1024];

    //set replycontent value
    strcpy(replycontent, "[");
    int i;
    for( i=0; i<2; i++){
        strcpy(replycontent, "TEST ONLY");
        strcat(replycontent, ",");
    }
    replycontent[strlen(contents)-1] = ']';

    xbuf_t *reply = get_reply(argv);
    xbuf_xcat(reply, replycontent);
    return 200;
}

RSS结果:
根8170 0.3 0.7 555392 5748 pts/0 Sl+10:29 0:00 |/opt/gwan/gwan
根8170 0.3 0.7 555392 5748 pts/0 Sl+10:29 0:00 |/opt/gwan/gwan
根8170 0.3 0.7 555392 5748 pts/0 Sl+10:29 0:00 |/opt/gwan/gwan
根8170 0.3 0.7 555392 5748 pts/0 Sl+10:29 0:00 |/opt/gwan/gwan
根8170 0.3 0.7 555392 5756 pts/0 Sl+10:29 0:00 |/opt/gwan/gwan
根8170 0.3 0.7 555392 5756 pts/0 Sl+10:29 0:00 |/opt/gwan/gwan
根8170 0.3 0.7 555392 5756 pts/0 Sl+10:29 0:00 |/opt/gwan/gwan
根8170 0.3 0.7 555392 5756 pts/0 Sl+10:29 0:00 |/opt/gwan/gwan
根8170 0.3 0.7 555392 5756 pts/0 Sl+10:29 0:00 |/opt/gwan/gwan
根8170 0.3 0.7 555392 5756 pts/0 Sl+10:29 0:00 |/opt/gwan/gwan
根8170 0.3 0.7 555392 5756 pts/0 Sl+10:29 0:00 |/opt/gwan/gwan
根8170 0.3 0.7 555392 5756 pts/0 Sl+10:29 0:00 |/opt/gwan/gwan
根8170 0.3 0.7 555392 5756 pts/0 Sl+10:29 0:00 |/opt/gwan/gwan
根8170 0.3 0.7 555392 5756 pts/0 Sl+10:29 0:00 |/opt/gwan/gwan
根8170 0.3 0.7 555392 5756 pts/0 Sl+10:29 0:00 |/opt/gwan/gwan
根8170 0.3 0.7 555392 5756 pts/0 Sl+10:29 0:00 |/opt/gwan/gwan
根8170 0.3 1.0 555392 7676 pts/0 Sl+10:29 0:00 |/opt/gwan/gwan
根8170 0.3 1.0 555392 7676 pts/0 Sl+10:29 0:00 |/opt/gwan/gwan
根8170 0.3 1.0 555392 7676 pts/0 Sl+10:29 0:00 |/opt/gwan/gwan
根8170 0.3 1.0 555392 7680 pts/0 Sl+10:29 0:00 |/opt/gwan/gwan
根8170 0.3 1.0 555392 7680 pts/0 Sl+10:29 0:00 |/opt/gwan/gwan
根8170 0.3 1.0 555392 7684 pts/0 Sl+10:29 0:00 |/opt/gwan/gwan
如果我将xbuf_xcat(reply, replycontent);更改为printf("reply:%s\n",replycontent);,RSS是稳定的,但仍会突然升高。

最佳答案

xbuf_xcat(get_reply(argv), replycontent)时,RSS值增长
使用xbuf_xcat(get_reply(argv), "value=1"),内存使用是稳定的
如工作xbuf_xcat(reply, "value=1")所示,G-WAN自动回收为replyxbuffer分配的内存,因此这不是问题所在。
你的问题在于如何生成replycontent
这部分代码在你的问题中丢失了如果你在寻求帮助,展示你在做什么可能会有帮助。
更新(在问题中的源代码公开之后)
您的代码使用的是在堆栈上分配的一个小缓冲区,因此它不会更改G-WAN的内存使用情况。
此外,您应该直接写入'reply'xbuffer,而不是写入一个临时缓冲区,然后将其复制到'reply'xbuffer中-要进行这样的复制,您应该使用xbuf_cat()或xbuf_ncat(),而不是xbuf_xcat()。
考虑到这段代码(没有想象力但毫无意义),您看到的内存“突然增加”可能来自于其他脚本(处理程序)中的问题?维护脚本?,操作系统/虚拟机配置?),或者如果使用非常高的并发性,则从您所做的测试中。
也许您可以尝试用另一种编程语言编写G-WAN servlet,而不是用C(G-WAN支持15种不同的编程语言,包括Java、C#、Perl、Python、Ruby等),这将帮助您避免大多数内存分配陷阱。

10-06 01:21