Category Archives: 허접프로그래머

HTTP 1.1 커넥션 수는 2개이다.

요즘 Ajax Leaders Club 이라는 스터디 모임에 참여하고 있습니다. 사실 리더는 못되지만 노력은 하고 있죠;;

몇일전 카페에서 커넥션수에 대한 논의가 있었던 모양입니다. 블랭커스님의 블로그글을 링크하자면 HTTP 1.0에서는 커넥션 제한이 4개였는데 1.1에 들어와서 2개로 줄었다는것입니다.

이부분에 대해서 저도 기억이 나는 부분이 있네요. 중학교~고1 시절 홈페이지를 만드는데(그당시에는 대부분이 모뎀이었고 잘사는 사람들은 ISDN을 쓰곤 했었습니다) 책에 이런 내용이 있었었죠.

“인터넷 익스플로러의 경우 동시에 4개씩을 다운 받을수 있습니다. 큰 이미지의 경우 4개로 쪼개면 좀더 빠른 다운로드를 도모할수 있습니다.”

그당시에는 홈페이지라고는 그저 HTML에 글자 몇개 끄적이고 큰 이미지 하나 올려놓으면 정말 멋지고 포토샵 잘하는 부러운 사람이었습니다.

그런데 저는 한발 더 앞서 그 그림을 4개로 쪼개기까지 했죠. 그리곤 BORDER없는 TABLE 2×2를 만들어 그림을 끼워넣곤 했습니다. 그당시의 모뎀으로 더더욱 잘 느낄수 있었지만 그림 4개가 동시에 읽혀지는 장관을 볼수 있었죠.

마치 달력을 넘긴달까? 위에서 부터 내려오는 혹은 GIF의 모자이크 형식으로 대충 읽었다가 점점 선명해 지는 광경을 이제는 볼수 없게 되어 버렸네요.

각설하고 그 2개의 커넥션이 호스트별 2개인지 브라우저별 2개인지 궁금해졌습니다.

증거자료를 제시하진 못하지만 서버를 모니터링 하면서 시름해본 결과 브라우저별 2개이네요. 당연하겠지만요;

브라우저 여러개 띄우면 다른 브라우저에서 다운중이라고 현재 브라우저가 기달려선 안되겠죠.

w3의 RPC문서 에도 같은 내용이 있네요. 8.1.4 Practical Considerations에 잠깐 언급하는군요.

물론 2개는 디폴트 설정이고 익스플로러의 경우는 레지스트리 설정을 바꾸어  늘릴수 있습니다.

HKEY_CURRENT_USER/Software/Microsoft/Windows/CurrentVersion/Internet Settings 밑의

MaxConnectionsPerServer 값을 2개에서 10(16진수 a)개정도로 올리면 속도의 향상을 느낄수 있습니다.

하지만 웹서비스를 준비하는 기업의 입장에서는 대부분의 사용자가 디폴트 설정을 가지고 있을것이다고 가정하고 작업하는것이 맞겠지요. 그래서 자바스크립트 파일을 합치는 식으로 로드해야 하는 오브젝트의 수를 줄이는것입니다.

열리는 커넥션을 테스트 하기위해서는 파이어폭스의 파이어버그나 iWatch등을 사용하면 됩니다. iWatch의 경우 Unix기반의 운영체제에서만 돌아가는 모양이네요. 파이어버그는 정확한 시간을 표시해 주지 못하는듯합니다.

서버관리자의 입장이라면 다음과 같이 측정할수 있습니다.

[code][root@tomeii /] # netstat -an | grep -c “:80.*127.0.0.1.*ESTABLISHED”[/code]

127.0.0.1에 모니터링할 호스트의 IP를 적어주면 됩니다.

서버의 80번 포트에 현재 접속한 호스트의 커넥션 수를 표시해 줍니다. 정상적이라면 페이지가 막 열릴때 2개를 넘지 않겠지요.

2개를 넘으면 악의적인 공격이다라고 판단할수도 있을것이라 생각합니다. 보통의 사용자가 같은 서버의 페이지를 2개이상 띄워놓고 동시에 접속하는 것이 아닌 이상은요.

아무튼 HTTP 1.1의 커넥션 수는 2개가 맞군요. 정확히는 디폴트 수가 2개입니다. 요즘 나오는 브랜드 PC들은 임의로 올려서 나오기도 하는군요. 제가 이번에 산 노트북이 복구시디로 밀고 확인해 보니 10개로 되어있습니다.

StringBuffer VS String

항상 이논쟁은 있어왔다. 계속해서 문자열을 이어붙여 나가는 작업이 필요할 경우 StringBuffer와 String중에 누가 더 빠르냐는 논쟁이었다.

당연히 StringBuffer가 빠르다는것이 대부분의 생각이지만 String이 오히려 더 빠르다는 의견도 있어왔다.

개인적으로 내가 사용하는 방식일때 퍼포먼스가 어떻게 될지 궁금해 졌다. 또는 붙어 나가는 글자수에 따라 또 다르지 않을까 하는 생각에 테스트를 해보게 되었다.

글자가 10개씩 붙을때와, 1000개씩 붙을때의 경우의 수에 따라 100개, 1,000개, 10,000개, 20,000개, 30,000개를 테스트 해보았다. 오차범위를 줄이기 위해 100번씩 돌렸다. 1000번 돌릴껄 그랬나?;;

테스트 코드는 다음과 같다.

StringBuffer :

public class StringBufferTest {

 public static void main ( String[] args ) {

  StringBuffer sb = new StringBuffer();

  long sTime = System.currentTimeMillis();

  for ( int i = 0 ; i < MAX_LOOP ; i++ ) {
   sb.append("DUMMY TEXT");
  }

  System.out.println("Elapsed Time : " + (System.currentTimeMillis()-sTime));
 }
}

String :

public class StringTest {

 public static void main ( String[] args ) {

  String str = "";

  long sTime = System.currentTimeMillis();

  for ( int i = 0 ; i < MAX_LOOP ; i++ ) {
   str += "DUMMY TEXT";
  }

  System.out.println("Elapsed Time : " + (System.currentTimeMillis()-sTime));
 }
}

결과는 다음과 같다.

사용자 삽입 이미지


글자가 10자리일때 : String의 경우 속도가 기하급수적으로 늘어나나 StringBuffer는 거의 속도변화가 없다.

사용자 삽입 이미지


글자가 1,000자리일때 : String의 경우 기하급수적으로 늘더니 10,000개부터는 아예 응답이 없다.
StringBuffer의 경우 20,000개부터는 메모리 힙영역이 부족하다는 에러메시지를 내뱉어버린다.

 

결론 : 저런 큰 작업은 그냥 복잡하게 생각하지 말고 StringBuffer를 쓰자. 하지만 보시다시피 1,000개 이상씩 수많은 작업을 할것이 아니라면 그것도 별 차이가 없다. 고로 무엇을 어떻게 쓰던 그다지 상관이 없다는것.