2013-06-11 5 views
0

NGINX와 PHP로 구동되는 8 개의로드 밸런싱 웹 서버가 있습니다. 이 웹 서버는 각각 중앙 MySQL 데이터베이스 서버에 데이터를 게시합니다. 그들은 [웹 서버]도 별도의 로그 서버 (한 줄씩)의 텍스트 파일에 동일한 데이터 (약간 포맷 됨)를 게시합니다. 즉, 하나의 데이터베이스 삽입 = 로그 파일의 한 줄.PHP 파일 쓰기 속도 향상

file_put_contents(file_path_to_log_file, single_line_of_text_to_log, FILE_APPEND | LOCK_EX); 

내가 초당 5,000 정도 로그에이 확장되는 데 문제 :

로깅을하고있는 PHP 파일의 활성 코드는 무엇인가 아래처럼 보인다. 작업을 완료하는 데 몇 초가 걸리고 로그 서버가 상당히 느려집니다.

나는 일들을 극적으로 빠르게 할 방법을 찾고있다. 나는 다음 기사를 보았다 : Performance of Non-Blocking Writes via PHP.

그러나 테스트에서 작성자는 쓰기 전에 모든 로그 데이터에 액세스 할 수있는 이점이 있습니다. 필자의 경우, 각 쓰기는 웹 서버에 의해 무작위로 시작됩니다.

PHP 작성 속도를 높이는 방법이 있습니까?! 아니면 그냥 데이터베이스 테이블에 로그 한 다음 나중에 데이터를 시간 간격으로 텍스트 파일로 덤프해야합니까?!

그냥 정보 : 전통적인 '로깅'의미에서 텍스트 파일을 사용하고 있지 않습니다 ... 텍스트 파일은 나중에 Google BigQuery에 먹일 CSV 파일입니다.

+0

왜 mysql 바이너리 로그를 사용하지 않습니까? 그것은 당신의 모든 실제 로깅 thats 것? 귀하의 IOP 한도에 도달 할 확률이 높습니다. IOP 당 더 많은 데이터를 쓸 수 있습니다. – exussum

+1

@ AD7six 데이터는 로깅 용이 아니며 나중에 Google BigQuery에 피드해야하는 CSV 데이터입니다. 나는 그 질문을 갱신 할 것이다. –

답변

1

모든 로그를 단일 서버에 작성 했으므로 로깅 서비스를 간단한 소켓 서버로 구현할 것을 고려 했습니까? 이렇게하면 서비스가 시작될 때 로그 파일을 한 번만 열어 로그 항목이 들어올 때 로그 파일에 기록하면됩니다. 또한이 작업을 기다릴 필요가없는 웹 서버 클라이언트의 추가 이점을 얻을 수 있습니다. 완료 ... 그들은 단순히 연결하여 데이터를 게시하고 연결을 끊을 수 있습니다.

+0

확인. 나는 소켓 서버 허가가 아닌 그걸 어떻게 꺼낼 지 잘 모르겠다. 내가 읽을 수있는 링크가 있나요?! –

+0

@ChuckUgwuh http://php.net/manual/en/intro.sockets.php 및 http://php.net/manual/en/sockets.examples.php – tftd

+0

@tftd 감사합니다. 소켓 서버를 관리하는 것은 말할 것도없고 (이 작업을하고 싶지도 않습니다.) 잠시 시간을내어이 문제를 해결하려고합니다. 또한 다른 시스템에서 파일을 사용하고 있기 때문에 저스틴의 접근법은 파일이 항상 '쓰여질'것이기 때문에 약간 까다로울 것입니다. –