[완료] apache 동시 접속에 관한 질문입니다.

superwisdom의 이미지

안녕하세요?

"after60sec.php" 라는 php 스크립트는 60초 뒤에 "abcd"라는 문자열을 echo 합니다. (sleep function 이용)

브라우저를 이용하여 해당 스크립트 url에 접근하면, 당연히 60초 뒤에 abcd 라는 문자열이 화면에 나타나지요.

이번에는 브라우저를 10개 띄우고, 거의 동시에 각각의 브라우저에서 위의 스크립트를 실행시켜보았습니다.

저의 예상은 60초 뒤에 10개의 브라우저에서 거의 동시에 abcd라는 문자열이 화면에 나타나는 것이었습니다. 하지만

현실은 첫번째 브라우저에서 60초 뒤에 abcd가 출력되고, 두번째 브라우저에는 첫번째 브라우저의 처리가 끝난 뒤에 또 60초를

기다렸다가 처리되었습니다. (10번째 브라우저는 약 600초를 기다린 셈이었죠)

왜 이럴까요? firefox3, ie7, chrome에서 각각 테스트 해보았고, 서버는 RHEL5 + PHP5 + apache 2.2 (RPM) 기본 설정이었습니다.

저는 동시에 10개의 브라우저에서 php스크립트를 동시에 처리하고 싶은데요..ㅠ.ㅠ

사실 제가 원하는건... AJAX를 이용, php 스크립트를 실행시킨 결과를 화면에 비 동기적으로 뿌리는 것입니다.

동일한 php 스크립트를 10번 가져오는데, 위의 결과가 나오면 비 동기적으로 가져오나 동기적으로 가져오나 차이가 없잖아요?

갑자기 웹이라니..... ㅠ.ㅠ

koseph의 이미지

아주 간단한 소스입니다.

<?php
// current time
echo date('h:i:s') . "<br />\n";
 
// sleep for 10 seconds
sleep(10);
 
// wake up !
echo date('h:i:s') . "\n";
 
?>

ab로 해본 결과를 보죠.

# ab -n 10 -c 10 http://192.168.0.10/10seconds.php
This is ApacheBench, Version 2.0.40-dev <$Revision: 1.146 $> apache-2.0
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Copyright 2006 The Apache Software Foundation, http://www.apache.org/

Benchmarking 192.168.0.10 (be patient).....done

Server Software: Apache/2.2.3
Server Hostname: 192.168.0.10
Server Port: 80

Document Path: /10seconds.php
Document Length: 24 bytes

Concurrency Level: 10
Time taken for tests: 10.32358 seconds
Complete requests: 10
Failed requests: 0
Write errors: 0
Total transferred: 2700 bytes
HTML transferred: 240 bytes
Requests per second: 1.00 [#/sec] (mean)
Time per request: 10032.357 [ms] (mean)
Time per request: 1003.236 [ms] (mean, across all concurrent requests)
Transfer rate: 0.20 [Kbytes/sec] received

Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 0.7 0 1
Processing: 10003 10018 9.7 10020 10031
Waiting: 10003 10017 9.5 10019 10030
Total: 10003 10018 10.1 10021 10032

Percentage of the requests served within a certain time (ms)
50% 10021
66% 10024
75% 10028
80% 10031
90% 10032
95% 10032
98% 10032
99% 10032
100% 10032 (longest request)

물론 requests를 동시에 100개 정도 보내면 프로세스가 생성되는 시간 때문에 10초 보다는 더 걸릴 수도 있습니다만.....
10개 정도라면 위의 결과처럼..... 거의 10초 대에 결과가 나와야 정상입니다.

저는 CentOS 5.2 x86_64 + Apache 2 (rpm) + PHP5 (rpm) 입니다.

아무 이상 없습니다.
---------------------------------
There's always another way, dear.

---------------------------------
There's always another way, dear.

김정균의 이미지

WinInet API 가 동일 도메인에 대해서 기본으로 2개의 세션밖에 열지 않을 겁니다. IE 의 경우 여기에 해당이 되겠지만, 다른 브라우저들이 WinInet API를 사용하는지는 모르겠군요 :-)

koseph의 이미지

IE는 2개, 2개씩 순차적으로 URL을 액세스 하는군요.

뭐, 이런........ 첨 알았습니다.

Safari는 3개씩 액세스 합니다.

모질라 불여우는 1개씩 순차적으로 액세스 하네요.

결국 클라이언트 문제 같습니다.
---------------------------------
There's always another way, dear.

---------------------------------
There's always another way, dear.

bookgekgom의 이미지

이런 테스트를 할때는 한 컴퓨터에서 하시지 마시구요...

프록시를 이용하여 여러 아이피에서 동접을 해보야 합니다.

프록시 10 개 돌려보면 값이 예상대로 나올듯 한데요...

---------------------------------------------------------------------------------------------------------------
루비 온 레일즈로 만들고 있는 홈페이지 입니다.

http://jihwankim.co.nr

여러 프로그램 소스들이 있습니다.

필요하신분은 받아가세요.

superwisdom의 이미지

답글 감사합니다. ^^

동일한 PC에서 ie7는 두 개씩 순차적으로, firefox나 chrome은 하나씩 순차적으로 실행됩니다.
PC 여러대와 함께 테스트해보면 문제 없이 각자의 브라우저에서 동시에 실행되구요. 아파치 로그도 위의 현상 그대로 입니다.

글을 올리기 전에 이 사실까지는 알아냈는데, 저는 아파치 설정 문제라고 생각했었죠. 답글을 보니 클라이언트 문제인 듯 하군요. ㅎㅎ

원래의 목적대로 AJAX를 이용하여, 스크립트가 실행되는대로(비동기적으로) 결과를 반영하려고 했습니다만, 이러면 원하는 목적을 달성할 수
없게 되겠네요. 최악의 경우, script_01.php, script_02.php, script_03.php... 이런 식으로 동일한 스크립트를 이름만 바꿔서 로드할 수 있겠습니다.
이렇게 하니, 동시에 접근이 가능합니다.

즉 url이 같으면 위와 같이 순차대로 실행되지만, url이 다르면 같은 클라이언트라 하더라도 동시에 실행됩니다. 브라우저 cache를 위해서 이런 식으로
동작하도록 설계된걸까요?

스크립트를 복사해서 이름만 바꾸는 꼼수를 사용하는 대신, 더 정석적인 방법을 찾게 되면 이곳에 추가로 답글을 남기겠습니다.

모두 감사합니다. ^^

koseph의 이미지

다른 이름의 스크립트를 여러개 만드시는 건 그다지 좋은 방법이 아니네요.

그냥 URL을 호출할 때 임의의 값을 난수(중복이 되지 않도록 간단히 제작)로 발생시켜 보내세요.

script_01.php?dummy=1
script_01.php?dummy=2
script_01.php?dummy=3

이런 식으로 호출하면 동일한 사이트라도 웹 브라우저가 URL을 달리 해석해서 몇 개라도 한꺼번에 작동합니다.
---------------------------------
There's always another way, dear.

---------------------------------
There's always another way, dear.

superwisdom의 이미지


firefox나 chrome에서는 GET method로 url에 data(유니크한 아이디)를 실어 보내면 원하는 대로 한꺼번에 작동합니다.

하지만 ie는... 무조껀 두개군요. ie가 사용하는 Wininet.dll에서는 서버당 최대 커넥션 수를 2개로 제한한다고 했는데,
생각해보니 다운로드 할 때도 최대 두개씩 받아지잖아요?

그래서 시중에 "인터넷 최적화 팁" 이라고 돌아다니는 문서를 찾아서 동시에 10개 다운로드 받는 법을 찾아보았습니다.

[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings] 에다가
"MaxConnectionsPer1_0Server"=dword:0000000a
"MaxConnectionsPerServer"=dword:0000000a

이러니 동시에 10개까지 스크립트 동시 실행이 가능해졌습니다. ㅎㅎ

ie로는 AJAX를 활용하는데도 한계가 있는거군요. ㅋ

참고로 1) ie8에서는 2개를 6개로 늘린답니다. 2) firefox나 safari는 Wininet.dll을 사용하지 않네요.

모두들 감사했습니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.