2013-03-08 2 views
0

현재 각 HTTP 게시 요청에서 본문 데이터의 내용을 가져 와서 로그 파일에 기록하는 것이 주된 책임 인 웹 서버를 작성한 것입니다. 게시물 데이터의 내용은 수신되면 난독 화됩니다. 그래서 나는 게시물 데이터를 모호하게 만들지 않고 서버의 로그 파일에 기록합니다. 난독 화 된 후 내용은 모든 요청마다 다른 일련의 임의 키 값 쌍입니다. 고정 데이터가 아닙니다.http 요청 후 로그 파일에 빠른 쓰기

서버에서 Linux 2.6 이상 커널을 실행 중입니다. 서버가 과도한 트래픽을 처리하도록 구성됩니다 (열린 파일의 제한은 32k 등). 이 응용 프로그램은 web.py 프레임 워크를 사용하여 Python으로 작성됩니다. http 서버는 Nginx 뒤에있는 Gunicorn입니다.

Apache Benchmark를 사용하여로드 테스트를 한 후 로그 쓰기 문제없이 초당 최대 600-700 개의 요청을 처리 할 수 ​​있다는 것을 알게되었습니다. Linux는 기본적으로 버퍼링 작업을 잘 수행합니다. 문제는 초당 많은 요청이 동시에 같은 파일에 쓰려고 할 때 발생하기 시작합니다. 데이터가 기록되지 않고 정보가 손실됩니다. 필자는 "파일에 직접 작성하는"설계가 제대로 된 솔루션이 아닐 수도 있음을 알고 있습니다.

누구든지이 문제를 극복 할 수있는 인프라와 코드를 너무 많이 변경하지 않고도 신속하게 구현할 수있는 솔루션을 제안 할 수 있는지 궁금합니다.

나는 Redis와 같은 메모리 저장 장치에 대해 읽었지만 서버 장애시 데이터가 메모리에 있으면 그 데이터가 손실된다는 것을 깨달았습니다. 나는 문서에서 Redis가 영구 저장소로 구성 될 수 있다는 것을 읽었습니다. Redis가 그것을 수행하기에 충분한 메모리가 서버에 필요합니다. 이 솔루션은 특정 간격으로 로그 파일에 Redis (메모리)의 데이터를 덤프 할 스크립트를 작성해야한다는 것을 의미합니다.

더 빠른 해결책이 있는지 궁금합니다. 어떤 도움이라도 대단히 감사하겠습니다!

+0

나쁜 디자인 일종의 데이터/필드/변수 또는 기타 등의 이유로 어떤 이유로 든 잘못된 것으로 간주되는 모든 요청을 작성하는 경우어떤 종류의 필터를 사용하거나 수신 된 데이터의 유효성을 검사하여 요청을 크게 낮추고 파일 대기열을 사용하여 파일 잠금을 처리하고 파일을 쓸 수있을 때마다 비동기 방식으로 작성해야합니다. 쓰여지고, 목록은 계속 나아 간다. – Gntem

+0

어떻게 gunicorn (어떤 작업자 클래스)을 실행합니까? 하나의 서버 프로세스 만 있으면'logging.FileHandler'가 유용 할 수 있습니다. 그렇지 않으면'logging.SyslogHandler'를 가능한 옵션으로 살펴보십시오. – robertklep

+0

mongodb의 쓰기 성능이 좋다고 들었습니다. – Ifthikhan

답변

1

내가 생각할 수있는 가능한 옵션은 별도의 로깅 프로세스입니다. 따라서 성능 문제로 인해 web.py를 보호 할 수 있습니다. 이것은 로깅 모듈을 처리하는 고전적인 방법입니다. IPC 또는 다른 버스 통신 인프라를 사용할 수 있습니다. 이를 통해 두 가지 문제를 해결할 수 있습니다.

  1. 로깅은 대용량 통화 흐름을위한 거대한 병 목이 아닙니다.
  2. 별도의 모듈로 스위치 꺼짐/켜기 기능을 보장/제공 할 수 있습니다.
  3. 따라서 거대하고 중요한 프로세스 메모리 사용량은 없습니다.

그러나 점 이하 명심해야 -

  1. 로깅 그냥 로그로 제한되어 있는지 확인해야합니다. 비즈니스 처리를위한 데이터 저장소가 아니어야합니다. 그렇지 않으면 비즈니스 로직에 많은 동기화 문제가있을 수 있습니다.
  2. 로깅 프로세스 (여기서는 실제 유닉스 프로세스를 의미 함)가 중요하고 약간 복잡해집니다 (즉, IPC 형식을 처리해야 할 수도 있음).

HTH!

+0

데이터가 1 ​​방향으로 만 흐르기 때문에 파이프가 잘 맞습니다. – Ifthikhan

+0

또한 추가하려면 처음부터 제품을 설계하는 경우 적어도 예상 벤치 마크의 1.5-2 배 시스템 성능을 목표로 제안하십시오. 제품이 라이프 사이클을 거치면서 성능이 저하 될 수 있습니다 (기능을 추가 할 때와 같이). –

관련 문제