CPU 90%차지하는 문제
글쓴이: linuxs / 작성시간: 월, 2003/06/30 - 11:04오전
즐거운 월요일(?)입니다.
서버 어플리케이션을 하나 테스트하고 있습니다.
top 명령어로 보니까 80-90%정도 이네요. 하드웨어는 C3 viaCPU를 사용하는데 800MHz정도 입니다.
서버 libpcap을 이용하여 패킷을 분석하여 해당 패킷들을 다른서버로 보내고 접속한 클라이언트에게는 libnet을 이용하여 보내는 프로그램입니다.
쓰레드가 3개 돌고 있습니다.
보통 CPU 자원을 많이 사용하는 때는 언제인지 궁금합니다.
예를 들어 연산(+,-,X..)을 하는데 많이 차지하는건지 또는 패킷을 처리하는데 CPU를 많이 차지 하는지 잘 모르겠습니다.
질문이 너무 막연한데 cpu를 많이 소모하는때가 어떤때인지 궁금합니다.
그럼 즐거운 하루 보내시길 바랍니다.
Forums:
Windows쪽의 경우 쓰레드 쓸때에 sleep을 넣어 주지 않으면 그러
Windows쪽의 경우 쓰레드 쓸때에 sleep을 넣어 주지 않으면 그러한 현상(CPU의 대부분을 소비해버리는)이 있습니다.
linux에서도 마찬가지가 아닐까 싶네요.
적당한곳에서 (보통 do while의 끝 부분쯤에) 적당히 sleep을 넣어 줍니다 ^^;
프로세스가 어떤 수행을 하는가에 따라서 cpu사용량이 틀리겠다는 생각이
프로세스가 어떤 수행을 하는가에 따라서 cpu사용량이 틀리겠다는 생각이 드네요.. 특수한 수행을 하나보죠? -.,^ 말씀하신 서버어플리케이션이라면 80프로까지 사용하지 않을꺼라 생각이 드는뎅...혹시 for문으로 무한 루프에 빠져 쉴세없이 돌아가는거는 아닌지요..^^?
루프를 돌때 그와 같은 현상의 원인이 제공됩니다.특히 루프안에서 sy
루프를 돌때 그와 같은 현상의 원인이 제공됩니다.
특히 루프안에서 system call을 전혀 사용하지 않으면 그러한 현상이
발생합니다.
Linux의 특성상 다른 프로세스로 전환을 이룰수 있는 경우가
Timer 발생시와 systemcall의 호출시에 일어나므로
그렇지 못하면 다른 프로세스가 일을 못하게 됩니다.
usleep 또는 select를 루프안에 삽입하세요.
usleep는 thread unsafe입니다.thread인경우 s
usleep는 thread unsafe입니다.
thread인경우 select를 사용하십시요..
trace 로 걸어보면 뭘 하고 있는지 알수 있지 않을까요? 아니면
trace 로 걸어보면 뭘 하고 있는지 알수 있지 않을까요?
아니면 time 명령으로 사용시간을 측정해 봐도
시스템콜에서 많이 쓰는지 유저모드에서 많이 쓰는지 알수 있을듯한데...
예를 들어 유저모드에서 많이 쓴다면
for(;;) 나 while(1) 같은 비교연산만 죽어라고 하면서 루프를 돌겠지요.
-- 처음에 글 올리신 분의 테스트 결과가 궁금하네요..
내 자식들도 나처럼 !!
프로파일러를 사용해서 시간을 측정해 보세요.
프로파일러를 사용해서 시간을 측정해 보세요.
어찌나 졸린지..~~
문제해결
여러분들에 덕분에 문제를 해결하였습니다.
문제는 디버깅모드가 디폴트로 되어 있어서 모든 출력이 콜솔로 나오더라구요
그래서 그 메시지를 없에기 위해서
./serverApp >/dev/null &
이렇게 실행했거든요 이때 90%정도 차지 했어요.
그래서 혹시나 해서 ./serverApp로 해보니까 cpu점유율이 거의 없었습니다.황당..^^
그래서 소스를 보니 그쪽 디버깅 모드를 실행하는곳이 쓰레드를 생성하고, ifdef로 되어있었습니다. 쩝.. 그래서 컴파일할때 DEBUG옵션 빼고 하니까 되네요
아래 소스에서 DebugGS 쓰레드에서 출력되는 메시지를 계속 /dev/null로 보내는 일이 있었나봐요.
넘 싱겁게 해결되었습니다
여러 리눅서님들께서 select나 sleep를 사용해보라고 하셨는데
실제로 일을 처리하는 쓰레드를 보니까 세마포어로 처리되어 있었습니다.
/////////////////////////////
#ifdef DEBUG
if (pthread_create(&tid, NULL, DebugGS, NULL)){
DMSG_EXIT("Cannot create DebugGS thread");
}
#endif
///////////////////////////////
void * DebugGS()
{
while(1)
{
fgets(cmd,10,stdin);
switch(cmd[0])
{
case 'p':
#ifdef DEBUG
printf("This number (just ENTER for all): ");
#endif
~~~~~~~~~~중략
}
}
}
꿈은 이루어진다.
댓글 달기