curl 왜 안드로이드만 느리죠? 아이폰은 빠른데!!

왜 안드로이드만 느려요?

여기 국내 최초의 멀티플랫폼 소셜 네트워크 게임이 있다.

 

안드로이드버전과 iOS버전이 있는데, 유독 안드로이드에서만 게임이 느리다고 한다.

 

“뭐가?? 어디가?? 어떻게 느려!!!??“

“나도몰라, 그냥 사람들이 안드로이드가 아이폰에비해 느리다니까 원인 찾아와!”

——————–

…………….

…………….

 

“안느려!! 그냥 기분탓이야!!”

내부 테스트결과, 단순 성능차이로 인해 느리다고 판단했고, 그렇게 끝나는 듯 했다.

 

하지만 안드로이드가 느리다는 글은 계속해서 올라왔다. 안드로이드폰을 사용하고 있는 필자도 느꼈다.

“이건 성능차이의 문제가 아닌데?? 갤S2는 졸라 좋자나, 근데 느려!!”

 

결국 원인을 찾았다.

 

게임은 웹 서버를 이용하고 있었고, http라이브러리인 curl을 이용하여 주로 통신을 하고 있었다. 아이폰과 안드로이드의 속도 차이는, 페이지를 요청하는 curl_easy_perform()함수에서 큰 차이가 났다.

 

하지만 항상 안드로이드가 느리진 않았다. 보통은 비슷하게 요청을 처리했지만, 불규칙적으로 안드로이드에서만 오랜 시간이 걸렸다. 테스트결과 피크타임에 웹서버에 부하가 걸릴 때 저런 현상이 나타났다. 그래서 테스트서버에서 테스트를 할 때는 저런 현상이 발견되지 않았던 것이다.

 

curl_easy_perform()함수를 통해 페이지 요청이 끝난 뒤에  curl_easy_getinfo() 함수를 통해 페이지 요청에 들어간 TOTAL_TIME과 CONNECT_TIME을 볼 수 있는데, CONNECT_TIME에서 두 OS가 큰 차이를 보였다.

 

ios에서 connect time은 0.xxx, 1.xxx, 2.xxx, 3.xxx가 나왔고, 안드로이드에서는 0.xxx, 3.xxx, 9.xxx, 21.xxx 가 나왔다. [3, 9, 21] 이 숫자는 어떤 의미가 있을까?

 

 

HTTP는 TCP다.

http는 tcp를 사용한다. 그리고 TCP Socket Connect Flow는 다음과 같은 3-WAY Handshake 방식을 따른다.

image

호스트A는 호스트B에 연결을 하겠다는 SYN을 보내면, 호스트B에서 그 SYN을 받았다는 SYN ACK를 돌려보내고, 그럼 호스트A는 그 ACK에 대한 ACK를 보내면서 연결이 완료된다.

만약 이 때, 호스트B에서 SYN ACK를 보내지 않는다면 호스트A는 어떤 동작을 할까?

 

Winsock에서는 Default로 SYN을 보낸뒤 응답이 오지 않으면, 3초뒤에 다시 SYN을 보낸다. 그래도 응답이 오지 않으면 6초뒤에(double) 다시 보내고 그 다음에는 12초뒤에(double) 다시 보낸다. 그래도 응답이 없으면 RTS가 오면서 연결에 실패 한다.

 

3, 6, 12 !!!!!!????

 

0+3 = (3),  3+6 = (9),  9+12 = (21) !!! 빙고!!!

 

안드로이드에서는 이 방식을 따르고 있었고, 서버에 요청을 하는 순간 서버에 connect가 꽉 차 있으면 3초 뒤, 6초 뒤, 12초 뒤에 다시 요청을 하고 있던 것이다. 하지만 iOS에서는 매 초당 다시 SYN을 보내고 있었고, 상대적으로 더 요청을 많이 하는 아이폰에서 서버의 자원을 독점하고 있었기 때문에 안드로이드에서 훨씬 느렸던 것이다.

 

자. 그럼 어떻게 두 os간의 밸런스를 맞출 수 있을까?

 

CONNECT_TIMEOUT

TCP Connect의 SYN을 다시 보내는 시간은 바꿀 수가 없었다. 하지만 curl에서 CONNECT_TIMEOUT을 설정 할 수 있다. 이 시간을 적절하게 설정해주면 된다.

 

curl_easy_setopt(_curl, CURLOPT_CONNECTTIMEOUT, connectTimeout);

이렇게 되면 아이폰 유저의 서버 독점은 막을 수 있지만 서버의 리소스는 한정되어 있기 때문에 안드로이드 유저가 속도 향상을 보는 만큼 아이폰 유저는 속도가 저하 될 것이다. 미소

 

그래도 독점은 나쁜 것이므로 이렇게 해결!ㅋㅋㅋㅋㅋ

 

 

 

 

 

근데 웹 서버가 빠르면 이럴 일이 없잖아? 슬퍼

 

 

 

 

curl 왜 안드로이드만 느리죠? 아이폰은 빠른데!! – 마침.

최 유상

토론토 외국인 노동자
Close Menu