안드로이드 개발 질문/답변
(글 수 45,052)
안녕하세요 아파치와 php를 이용하여 게임서버를 만들고 있습니다~
스트레스 테스트를 위해 아래상황을 연출햇는데요...
php페이지를 apache를 이용해서 호출을해서 DB에 데이터를 저장하도록하였습니다...
for문으로 5000개 정도로해서 데이터저장을 요청했습니다...
데이터를 저장하는 php가 5000번이 불리는상황인데.. (스트레스테스트를 위해 일부러..)
근데 DB에 많은 값이 비었습니다...
10개 ~ 100개 이상의 데이터가 유실되는 경우도 발생합니다 (php 한번호출에 4개의 데이터를 저장)
DB측에 이야기했더니 apache에서 먼저 유실된게 아닌지 의심해 보라고 하시더라구요
그래서
apache설정을 올려봅니다...
phpinfo()
___________________________________________________________________________
System Linux ubuntu 3.2.0-37-generic #58-Ubuntu SMP Thu Jan 24 15:28:10 UTC 2013 x86_64
Build Date Jan 18 2013 23:33:58
Server API CGI/FastCGI
Virtual Directory Support disabled
Configuration File (php.ini) Path /etc/php5/cgi
Loaded Configuration File /etc/php5/cgi/php.ini
Scan this dir for additional .ini files /etc/php5/cgi/conf.d
Additional .ini files parsed /etc/php5/cgi/conf.d/pdo.ini, /etc/php5/cgi/conf.d/xdebug.ini
PHP API 20090626
PHP Extension 20090626
Zend Extension 220090626
Zend Extension Build API220090626,NTS
PHP Extension Build API20090626,NTS
Debug Build no
Thread Safety disabled
Zend Memory Manager enabled
Zend Multibyte Support disabled
IPv6 Support enabled
Registered PHP Streams https, ftps, compress.zlib, compress.bzip2, php, file, glob, data, http, ftp, phar, zip
Registered Stream Socket Transports tcp, udp, unix, udg, ssl, sslv3, tls
Registered Stream Filters zlib.*, bzip2.*, convert.iconv.*, string.rot13, string.toupper, string.tolower, string.strip_tags, convert.*, consumed, dechunk
_______________________________________________________________________________
apache 설정 파일 (apache2.conf)
________________________________________________________________________________
Timeout 300
MaxKeepAliveRequests 1024
KeepAliveTimeout 5
<IfModule mpm_worker_module>
StartServers 8
MinSpareThreads 64
MaxSpareThreads 512
ThreadLimit 1024
ThreadsPerChild 64
MaxClients 1024
MaxRequestsPerChild 0
</IfModule>
________________________________________________________________________________
아파치 정보 -V
________________________________________________________________________________
root@ubuntu:~# apachectl -V
Server version: Apache/2.2.22 (Ubuntu)
Server built: Nov 8 2012 21:37:37
Server's Module Magic Number: 20051115:30
Server loaded: APR 1.4.6, APR-Util 1.3.12
Compiled using: APR 1.4.6, APR-Util 1.3.12
Architecture: 64-bit
Server MPM: Worker
threaded: yes (fixed thread count)
forked: yes (variable process count)
Server compiled with....
-D APACHE_MPM_DIR="server/mpm/worker"
-D APR_HAS_SENDFILE
-D APR_HAS_MMAP
-D APR_HAVE_IPV6 (IPv4-mapped addresses enabled)
-D APR_USE_SYSVSEM_SERIALIZE
-D APR_USE_PTHREAD_SERIALIZE
-D SINGLE_LISTEN_UNSERIALIZED_ACCEPT
-D APR_HAS_OTHER_CHILD
-D AP_HAVE_RELIABLE_PIPED_LOGS
-D DYNAMIC_MODULE_LIMIT=128
-D HTTPD_ROOT="/etc/apache2"
-D SUEXEC_BIN="/usr/lib/apache2/suexec"
-D DEFAULT_PIDLOG="/var/run/apache2.pid"
-D DEFAULT_SCOREBOARD="logs/apache_runtime_status"
-D DEFAULT_ERRORLOG="logs/error_log"
-D AP_TYPES_CONFIG_FILE="mime.types"
-D SERVER_CONFIG_FILE="apache2.conf"
_______________________________________________________________________________
설정에 문제가 있길 바랍니다 ㅠㅠ
답이 안보이네요 ㅠㅠ흑흑
많은 답변 부탁드립니다 ㅠㅠ 감사합니다.
_________________________________________________________________________________________
이런 글을 올렸었는데
좀더 추적을 해보니 php가 요청될 때마다 로그를 찍도록 했더니 만약 3000번 호출했을때 로그가 1000개 정도 찍히고
DB에는 그 1000개가 저장되더라구요..
확실히 DB문제는 아닌 것 같습니다.
저 php 호출 루틴이 문제 인것 같은데...
아래와 같습니다..
for (var i = 0; i <= max; ++i )
{
str =account+i;
sendsize += str.length;
request = new XMLHttpRequest();
request.onreadystatechange = on_End( max, "End");
request.ope("GET", "http://localhost/stress.php?account="+str, true);
request.send(null);
}
이런 루틴으로 호출하게 하였구요 max가 3000이면 3000번 호출합니다!
그리고 저 호출이 완료되어 메세지를 받았을때 on_End함수는 아래와 같습니다.
function on_End(counter, successMsg)
{
endcount++;
if ( counter <= endcount )
{
endtime = +new Date;
var elapsedtime = (endtime -starttime)/1000;
confirm(elapsedtime.toFixed(10)+"(초)"+"\n" + sendsize + "byte"+ " " + successMsg+" 완료 "+ endcount);
}
}
이렇게 호출하고 있는데요
on_End에서 confirm이 분명 3000개 완료되었다고 딱 뜨는데..
실제 호출한 php페이지는 1000개 이고...
XMLHttpRequest의 호출이 묻힐 수도 있는건가요??
2013.02.05 17:39:20
말씀듣고 비동기를 좀 봤더니
XMLHttpRequest에서 완료 통지 call이 호출 된다고 해서 다 완료가 아니라 readystate가 4인 상태가 진짜 완료인데..
저는 그냥 함수 call만되면 완료라고 생각했네요
readystate == 4라는 조건을 주자 제대로 동작하지 않는 것을 확인했습니다.
이전에 readystate==4조건을 주기전에
apache access.log에서는 3000번 요청이었으면 3000번의 access가 일어나고 있습니다.
대신 실제 php가 호출되면 로그를 찍도록했는데 거긴 2000번 정도가 찍혔구요...
php쪽 설정의 문제가 아닐지 의심해봅니다 ㅠㅠ
답변감사드립니다...




저도 경험은 별로 없고 몇가지 테스트를 해봐야 알 수 있겠지만 생각나는 것만 적어봅니다.
1. 자바에서 http통신을 요청하고 완료 통지를 받을 때 까지 시간이 걸리는데 for문 도는동안 전송 가능한 량이나 통지받는 시간 등에 의해서
전부 전송이 안될 수가 있습니다.
보내고 리퀘스트 받은 내용을 기록해보세요
2. 보통 연결을 하고 내용을 보내달라고 하면 네트워크 장치에 타겟과 내용을 전달하고 네트워크 장치에 달린 메모리에 적재했다가 전송하고
결과를 통보하는게 보통입니다.
3. 1:1로 통신해서 스트레스 테스트를 하면 받는 쪽이나 보내는 쪽이나 동등하게 스트레스 테스트 하는 셈이 아닐까요?
전문가에게 맡길 생각이 아니시라면
블러킹 논블러킹 동기 비동기 동기통지 비동기통지 어싱크소켓 이벤트소켓 오버랩드io
서버에 전송되는 일렬의 과정(함수 호출하면 누가 받아서 어떤 장치가 어떻게 전달받고 어떻게 처리하는가)
HTTP통신은 어떻게 이루어지고 특징은 무엇인가
자바에서 HTTP통신 요청하면 메소드 내부적으로 어떻게 처리되는가
아파치서버와 php가 동작하는 기반
이정도는 공부를 해보시는 것이 좋을 것 같습니다.
그리고 3천회 정도 for문 돌면서 스트레스 테스트 하는 서버라면
http말고 소켓통신을 추천합니다. udp라던지...
죰 간단하게 잘 알려주실 분이 답변 달아주시면 더 좋겠지만요...