我在gwan上遇到了一个关于回复请求的问题,当我调用函数xbuf_xcat(get_reply(argv), replycontent)
时,RSS值一直在上升。如果我评论这个函数或更改为xbuf_xcat(get_reply(argv), "value=1")
,这种奇怪的现象就不会发生。。。
root 20365 0.5 0.8 4038486468pts/0 Sl+15:07 0:00|_/opt/gwan/gwan
root 20365 0.5 0.8 4038486488pts/0 Sl+15:07 0:00|_/opt/gwan/gwan
root 20365 0.5 0.8 4038486492pts/0 Sl+15:07 0:00|_/opt/gwan/gwan
root 20365 0.5 0.8 4038486496pts/0 Sl+15:07 0:00|_/opt/gwan/gwan
root 20365 0.5 0.8 4038486500pts/0 Sl+15:07 0:00|_/opt/gwan/gwan
root 20365 0.5 0.8 4038486504pts/0 Sl+15:07 0:00|_/opt/gwan/gwan
root 20365 0.6 0.8 4038486504pts/0 Sl+15:07 0:00|_/opt/gwan/gwan
root 20365 0.6 0.8 4038486528pts/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结果:
root 8170 0.3 0.7 5553925748pts/0 Sl+10:29 0:00|_/opt/gwan/gwan
root 8170 0.3 0.7 5553925748pts/0 Sl+10:29 0:00|_/opt/gwan/gwan
root 8170 0.3 0.7 5553925748pts/0 Sl+10:29 0:00|_/opt/gwan/gwan
root 8170 0.3 0.7 5553925748pts/0 Sl+10:29 0:00|_/opt/gwan/gwan
root 8170 0.3 0.7 5553925756pts/0 Sl+10:29 0:00|_/opt/gwan/gwan
root 8170 0.3 0.7 5553925756pts/0 Sl+10:29 0:00|_/opt/gwan/gwan
root 8170 0.3 0.7 5553925756pts/0 Sl+10:29 0:00|_/opt/gwan/gwan
root 8170 0.3 0.7 5553925756pts/0 Sl+10:29 0:00|_/opt/gwan/gwan
root 8170 0.3 0.7 5553925756pts/0 Sl+10:29 0:00|_/opt/gwan/gwan
root 8170 0.3 0.7 5553925756pts/0 Sl+10:29 0:00|_/opt/gwan/gwan
root 8170 0.3 0.7 5553925756pts/0 Sl+10:29 0:00|_/opt/gwan/gwan
root 8170 0.3 0.7 5553925756pts/0 Sl+10:29 0:00|_/opt/gwan/gwan
root 8170 0.3 0.7 5553925756pts/0 Sl+10:29 0:00|_/opt/gwan/gwan
root 8170 0.3 0.7 5553925756pts/0 Sl+10:29 0:00|_/opt/gwan/gwan
root 8170 0.3 0.7 5553925756pts/0 Sl+10:29 0:00|_/opt/gwan/gwan
root 8170 0.3 0.7 5553925756pts/0 Sl+10:29 0:00|_/opt/gwan/gwan
root 8170 0.3 1.0 5553927676pts/0 Sl+10:29 0:00|_/opt/gwan/gwan
root 8170 0.3 1.0 5553927676pts/0 Sl+10:29 0:00|_/opt/gwan/gwan
root 8170 0.3 1.0 5553927676pts/0 Sl+10:29 0:00|_/opt/gwan/gwan
root 8170 0.3 1.0 5553927680pts/0 Sl+10:29 0:00|_/opt/gwan/gwan
root 8170 0.3 1.0 5553927680pts/0 Sl+10:29 0:00|_/opt/gwan/gwan
root 8170 0.3 1.0 5553927684pts/0 Sl+10:29 0:00|_/opt/gwan/gwan
如果我将xbuf_xcat(reply, replycontent);
更改为printf("reply:%sn",replycontent);
,RSS是稳定的,但仍会突然上升。
有了
xbuf_xcat(get_reply(argv), replycontent)
,RSS价值增长使用xbuf_xcat(get_reply(argv), "value=1")
,内存使用率稳定
如工作的xbuf_xcat(reply, "value=1")
所示,G-WAN会自动回收分配给reply
xbuffer的内存,因此这不是问题所在。
您的问题来自于如何生成replycontent
。
这部分代码在您的问题中丢失了。如果你正在寻求帮助,展示你正在做的事情可能会有所帮助。
UPDATE(根据问题中的源代码披露)
您的代码使用堆栈上分配的小缓冲区,因此不会更改G-WAN的内存使用情况。
此外,您应该直接写入"reply"xbuffer,而不是写入一个临时缓冲区,然后将其复制到"reply"xbbuffer中。要进行这样的复制,您应该使用xbuf_cat()或xbuf_ncat(),而不是xbuf_xcat()。
考虑到这段代码(虽然不起眼,但毫无意义),您看到的内存"突然增加"可能来自其他脚本(处理程序?维护脚本?、操作系统/虚拟机配置?)中的问题,或者来自您在使用非常高的并发性时所做的测试。
也许你可以尝试用C之外的另一种编程语言编写G-WAN servlet(G-WAN支持15种不同的编程语言,包括Java、C#、Perl、Python、Ruby等),这将帮助你避免大多数内存分配陷阱。
这看起来像是典型的内存泄漏。
请注意,格式化函数xbuf_xcat()
(在我看来,名称很奇怪)将动态分配内存来保存生成的文本。
如果不在传递给xbuf_xcat()
的xbuf_t
上调用xbuf_free()
,则内存泄漏。