Public/tip & tech

[개발 팁]개발시 성능 시험 이슈에 대한 팁 공유

quantapia 2009. 12. 18. 17:58

이 메일은 제가 근무하는 필링크 전사메일로 뿌린 내용입니다.

안녕하세요.  LGT WAP20 프로젝트를 진행하고 있는 전성현 과장입니다.

많은 분들이 개발이 완료되고 기능시험을 무난히 통과 한 후 성능시험을 진행하다 예상치 못하게 성능이 안나와

고전하신 적이 많으실 거라 생각되어 팁 공유차원에서 메일을 드립니다.

 

사실 우리가 격는 성능 이슈의 많은 부분을 차지하는 것이

1. 메모리 누수

2. 과도한 CPU 사용으로 인한 TPS 저하

입니다.

 

1번은 2번에 비해 찾기가 오히려 쉬우므로 넘어가겠습니다.

 

11월경 LGT WAP20 IP 인증 구조개선 프로젝트에 대한 성능 시험이 있었습니다.

문제가 되었던 것이 구조개선 전 1700 TPS 의 성능을 자랑하던 WAP G/W TPS 1000 을 못넘고 700 에서 cpu 90%

차지하면서 LGT 성능기준치에 못미치는 사태가 발생하였습니다.

 

문제가 발생하면 늘 그렇듯이 해외 싸이트와 국내 KLDP 를 뒤져 문제가 되는 부분의 원인을 찾던 중 소스에서 흥미로운 사실을 발견했습니다.

초기화를 위해 우리가 즐겨쓰는 memset 의 남발이었습니다.

우리는 memset 을 이용한 초기화를 보편적으로 사용하고 있습니다. (저처럼 아무 생각없이 쓰는 분들 계실겁니다. )

 

하지만 원래가 memset은 생각보다 상당히 느립니다. 기본적으로 byte단위로 복사하기 때문이죠.

예를 들어 4096바이트 크기의 배열을 모두 특정 byte값으로 채우는걸 생각해 본다면... 기본적으로 memset 4096회의 대입연산을 수행합니다.

mem으로 시작하는 기본 함수들은 대부분 곧이곧대로 채워 넣는 방식이라서 속도가 느립니다.

 

WAP G/W 는 데이터 수신하여 처리하는 매 루프마다 2 메가 가까이 되는 데이터 저장소와 수많은 buffer memset 을 이용하여 초기화 하는 것이 문제가 되었습니다.

 

해결 방안은

Memset(spTR->stBuff.cpData, 0x00, MAX_BUFFER_LEN);

 

대신

 

spTR->stBuff.cpData[0] = 0x00;

spTR->stBuff.nLen  = 0;

 

을 사용하여 해결 하였습니다. 참 간단하죠~.

결론은 Memset 은 꼭 필요할 때만 써야한 다는 것입니다.

 

Strcpy memcpy 의 차이에 대한 성능이슈도 있지만 많은 분들이 알고 계신듯 하여 다음에 기회가 된다면 다시 거론하겠습니다.

 

2그룹의 개발하시는 분들께서는 업무에 참고 하시기 바랍니다.

 

전 성현 드림.

 

 

전 성 현 사업2그룹/과장   FEELing

Phone_ 010.5015.2133  Mail_ shjeon@feelingk.com