我在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自动回收为reply
xbuffer分配的内存,因此这不是问题所在。
你的问题在于如何生成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等),这将帮助您避免大多数内存分配陷阱。