2013-08-13 1 views
1

gwan의 회신 요청에 관한 문제를 만났습니다. 함수 xbuf_xcat(get_reply(argv), replycontent)을 호출하는 동안 RSS 값이 계속 올라갑니다. 나는이 기능을 댓글 xbuf_xcat(get_reply(argv), "value=1")로 변경하는 경우,이 이상한 현상은G-wan xbuf_xcat(), 메모리 누수입니까?

루트 ... 일어나지 않을 것입니다 20365 0.5 0.8 403,848 6468 점/0 SL + 15시 7분 0시 | _/opt/gwan/gwan
루트 20365 0.5 0.8 403848 pts/0 Sl + 15:07 0:00 | _/opt/gwan/gwan
루트 20365 0.5 0.8 403848 pts/0 Sl + 15:07 0:00 | _/opt/gwan/gwan
루트 20365 0.5 0.8 403848 pts/0 Sl + 15:07 0:00 | _/opt/gwan/gwan
루트 20365 0.5 0.8 403848 pts/0 Sl + 15:07 0:00 | _/opt/gwan/gwan
루트 20365 0.5 0.8 403848 pts/0 Sl + 15:07 0:00 | _/opt/gwan/gwan
루트 20365 0.6 0.8 403848 pts/0 Sl + 15:07 0:00 | _/opt/gwan/gwan
루트 20365 0.6 0.8 403848 pts/0 Sl + 15:07 0:00 | _/옵션/외무성 부상/외무성 부상

(I 하룻밤을 실행하면, 거의 1 기가 바이트 메모리를 사용 ...)
어떤 생각?

코드 나 수정 : 아래

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); 

코드의 내용은 다음과 같습니다 (I 단순히 그것이 내가 쓰기 기능을 사용하지 않는,하지만 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 555,392 5748 점/0 SL + 10시 29분 0시 | _/opt/gwan/gwan
루트 8170 0.3 0.7 555392 pts/0 Sl + 10:29 0:00 | _/opt/gwan/gwan
루트 8170 0.3 0.7 555392 pts/0 Sl + 10:29 0:00 | _/opt/gwan/gwan
루트 8170 0.3 0.7 555392 pts/0 Sl + 10:29 0:00 | _/opt/gwan/gwan
루트 8170 0.3 0.7 555392 pts/0 Sl + 10:29 0:00 | _/opt/gwan/gwan
루트 8170 0.3 0.7 555392 pts/0 Sl + 10:29 0:00 | _/opt/gwan/gwan
루트 8170 0.3 0.7 555392 pts/0 Sl + 10:29 0:00 | _/opt/gwan/gwan
루트 8170 0.3 0.7 555392 pts/0 Sl + 10:29 0:00 | _/opt/gwan/gwan
루트 8170 0.3 0.7 555392 pts/0 Sl + 10:29 0:00 | _/opt/gwan/gwan
루트 8170 0.3 0.7 555392 pts/0 Sl + 10:29 0:00 | _/opt/gwan/gwan
루트 8170 0.3 0.7 555392 pts/0 Sl + 10:29 0:00 | _/opt/gwan/gwan
루트 8170 0.3 0.7 555392 pts/0 Sl + 10:29 0:00 | _/opt/gwan/gwan
루트 8170 0.3 0.7 555392 pts/0 Sl + 10:29 0:00 | _/opt/gwan/gwan
루트 8170 0.3 0.7 555392 pts/0 Sl + 10:29 0:00 | _/opt/gwan/gwan
루트 8170 0.3 0.7 555392 pts/0 Sl + 10:29 0:00 | _/opt/gwan/gwan
루트 8170 0.3 0.7 555392 pts/0 Sl + 10:29 0:00 | _/opt/gwan/gwan
루트 8170 0.3 1.0 555392 pts/0 Sl + 10:29 0:00 | _/opt/gwan/gwan
루트 8170 0.3 1.0 555392 pts/0 Sl + 10:29 0:00 | _/opt/gwan/gwan
루트 8170 0.3 1.0 555392 pts/0 Sl + 10:29 0:00 | _/opt/gwan/gwan
루트 8170 0.3 1.0 555392 pts/0 Sl + 10:29 0:00 | _/opt/gwan/gwan
루트 8170 0.3 1.0 555392 pts/0 Sl + 10:29 0:00 | _/opt/gwan/gwan
루트 8170 0.3 1.0 555392 pts/0 Sl + 10:29 0:00 | _/옵션/외무성 부상/외무성 부상

내가 xbuf_xcat(reply, replycontent);printf("reply:%s\n",replycontent);에 변경하면, RSS는 안정적이지만, 갑자기 발생 계속 상승.

+0

버퍼에서'xbuf_free()'를 호출 한 적이 있습니까? – unwind

+0

아니요, 절대로이 작업을 수행해야합니까? – moriya

+1

무료로 응답해야합니까? – csw

답변

0

xbuf_xcat(get_reply(argv), replycontent)으로, RSS 값은 작업 xbuf_xcat(reply, "value=1") 수 있듯이 xbuf_xcat(get_reply(argv), "value=1")와 는, 메모리 사용량, G-WAN 자동으로 reply xbuffer에 할당 된 메모리를 재활용

안정 성장, 그래서 이것은 아니다 문제.

문제는 오히려 당신이 replycontent을 어떻게 생성하는지에 기인합니다.

그리고이 부분은 귀하의 질문에 없습니다. 도움을 청하면 도움이 될 수도 있습니다.(질문의 소스 코드를 공개 다음)


UPDATE

귀하의 코드는 G-WAN의 메모리 사용을 변경하지 않도록 스택에 할당 작은 버퍼를 사용하고 있습니다.

게다가 'reply'xbuffer에 복사 된 임시 버퍼가 아닌 'reply'xbuffer에 직접 쓰고 그 복사본을 만들려면 xbuf_cat() 또는 xbuf_ncat()을 사용해야합니다.)가 아니라 xbuf_xcat().

이 코드는 (손상되지는 않지만 무의미한) 코드를 사용하면 다른 스크립트 (처리기, 유지 관리 스크립트, OS/VM 구성)의 문제 또는 사용자가 만든 테스트 매우 높은 동시성 통화를 사용하는 경우.

C, G-WAN이 Java, C#, Perl, Python, Ruby 등 15 가지 프로그래밍 언어를 지원하는 다른 프로그래밍 언어로 G-WAN 서블릿을 작성할 수 있습니다. 대부분의 메모리 할당 함정.

+0

게다가 메모리 사용량이 갑자기 서버에 요청을 보내지 않더라도 RSS가 5900에서 7800으로 상승합니다. 정상입니까? – moriya

+0

클라이언트 작업 없음 가상 머신 (Xen, VMWare 등), G-WAN 유지 관리 스크립트 또는 havok으로 진행되는 G-WAN 처리기가 없으면 G-WAN은 더 많은 메모리를 할당 할 필요가 없습니다. – Gil

+0

실제로 VirtualBox에서 G-wan을 테스트합니다. 다른 컴퓨터로 변경하면이 이상한 문제가 사라집니다 !!! 대단히 감사합니다 !!! 그러나, 메모리의 갑작스러운 상승 (나는 어떤 처리기, 유지 보수 스크립트 등을 설정하지 않습니다) – moriya

-1

이것은 고전적인 메모리 누수처럼 보입니다.

(제 생각에는 이상하게 명명 된) 서식 지정 함수 xbuf_xcat()은 동적으로 결과 텍스트를 저장할 메모리를 할당합니다.

xbuf_xcat()로 전달 된 xbuf_t에서 xbuf_free()을 호출하지 않으면 메모리가 누수됩니다.

+0

답장을 보내 주셔서 감사합니다. xbuf_free를 사용해도 여전히 동일한 결과를 얻었습니다. 모든 요청에 ​​대해 여전히 RSS가 상승하고 있습니다 ... – moriya

+1

'reply' xbuffer에서'xbuf_free()'를 호출하면 G-WAN 원 당신이 건설 한 (자유로운) 응답을 제공 할 수 없게됩니다. 'reply' 버퍼를 결코 비우지 마십시오. 문제는 오히려 'replycontent'가 생성되는 방식 (질문에서 공개하지 않는 것)에서 오는 것입니다. – Gil