1

我在gwan上遇到了回复请求的问题,当我调用function xbuf_xcat(get_reply(argv), replycontent)时,RSS值不断上升。如果我把这个函数注释掉或者改成xbuf_xcat(get_reply(argv), "value=1"),就不会出现这种奇怪的现象了……

根 20365 0.5 0.8 403848 6468分/0 Sl+ 15:07 0:00 | _ /opt/gwan/gwan
root 20365 0.5 0.8 403848 6488 pts/0 Sl+ 15:07 0:00 | _ /opt/gwan/gwan
root 20365 0.5 0.8 403848 6492 pts/0 Sl+ 15:07 0:00 | _ /opt/gwan/gwan
root 20365 0.5 0.8 403848 6496 pts/0 Sl+ 15:07 0:00 | _ /opt/gwan/gwan
root 20365 0.5 0.8 403848 6500 pts/0 Sl+ 15:07 0:00 | _ /opt/gwan/gwan
root 20365 0.5 0.8 403848 6504 pts/0 Sl+ 15:07 0:00 | _ /opt/gwan/gwan
根 20365 0.6 0.8 403848 6504分/0 Sl+ 15:07 0:00 | _ /opt/gwan/gwan
root 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分/0 Sl+ 10:29 0:00 | _ /opt/gwan/gwan
root 8170 0.3 0.7 555392 5748 pts/0 Sl+ 10:29 0:00 | _ /opt/gwan/gwan
root 8170 0.3 0.7 555392 5748 pts/0 Sl+ 10:29 0:00 | _ /opt/gwan/gwan
root 8170 0.3 0.7 555392 5748 pts/0 Sl+ 10:29 0:00 | _ /opt/gwan/gwan
root 8170 0.3 0.7 555392 5756 pts/0 Sl+ 10:29 0:00 | _ /opt/gwan/gwan
root 8170 0.3 0.7 555392 5756 pts/0 Sl+ 10:29 0:00 | _ /opt/gwan/gwan
root 8170 0.3 0.7 555392 5756分/0 Sl+ 10:29 0:00 | _ /opt/gwan/gwan
root 8170 0.3 0.7 555392 5756 pts/0 Sl+ 10:29 0:00 | _ /opt/gwan/gwan
root 8170 0.3 0.7 555392 5756 pts/0 Sl+ 10:29 0:00 | _ /opt/gwan/gwan
root 8170 0.3 0.7 555392 5756 pts/0 Sl+ 10:29 0:00 | _ /opt/gwan/gwan
root 8170 0.3 0.7 555392 5756 pts/0 Sl+ 10:29 0:00 | _ /opt/gwan/gwan
root 8170 0.3 0.7 555392 5756 pts/0 Sl+ 10:29 0:00 | _ /opt/gwan/gwan
root 8170 0.3 0.7 555392 5756 pts/0 Sl+ 10:29 0:00 | _ /opt/gwan/gwan
根 8170 0.3 0.7 555392 5756分/0 Sl+ 10:29 0:00 | _ /opt/gwan/gwan
root 8170 0.3 0.7 555392 5756 pts/0 Sl+ 10:29 0:00 | _ /opt/gwan/gwan
root 8170 0.3 0.7 555392 5756 pts/0 Sl+ 10:29 0:00 | _ /opt/gwan/gwan
root 8170 0.3 1.0 555392 7676 pts/0 Sl+ 10:29 0:00 | _ /opt/gwan/gwan
root 8170 0.3 1.0 555392 7676 pts/0 Sl+ 10:29 0:00 | _ /opt/gwan/gwan
root 8170 0.3 1.0 555392 7676 pts/0 Sl+ 10:29 0:00 | _ /opt/gwan/gwan
根 8170 0.3 1.0 555392 7680分/0 Sl+ 10:29 0:00 | _ /opt/gwan/gwan
root 8170 0.3 1.0 555392 7680 pts/0 Sl+ 10:29 0:00 | _ /opt/gwan/gwan
root 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 是稳定的,但仍然会出现突然上升。

4

2 回答 2

0

With xbuf_xcat(get_reply(argv), replycontent), RSS 值增长 With 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()。

鉴于此(未损坏但毫无意义)代码,您看到的内存“突然增加”可能来自其他脚本(处理程序?维护脚本?,OS/VM 配置?)中的问题,或者来自您在使用时所做的测试非常高的并发。

也许您可以尝试用 C 以外的其他编程语言编写 G-WAN servlet(G-WAN 支持 15 种不同的编程语言,包括 Java、C#、Perl、Python、Ruby 等),这将帮助您避免大多数内存分配陷阱.

于 2013-08-13T15:44:47.337 回答
-1

这看起来像是经典的内存泄漏。

请注意,(在我看来,名字很奇怪)格式化函数xbuf_xcat()函数将动态分配内存来保存结果文本。

如果您不调用xbuf_free()传递xbuf_t的 to xbuf_xcat(),则内存泄漏。

于 2013-08-13T08:17:12.357 回答