2010-02-19 3 views
4

나는 내 웹 응답을 생성 할 lookuptables가 많다.메모리에서 모든 것을 제공하기 위해 어떤 webserver/mod/technique를 사용해야합니까?

Asp.net을 사용하여 IIS를 사용하면 메모리에 정적 lookuptables를 유지하여 내 응답을 매우 빠르게 처리 할 수 ​​있다고 생각합니다.

동일한 기능을 수행 할 수있는 .net 이외의 솔루션이 있습니까?

나는 fastcgi를 보았다. 그러나 나는 이것이 누구나 Y 요청을 처리 할 수있는 X 프로세스를 시작한다고 생각한다. 그러나 프로세스는 정의상 서로로부터 보호됩니다. fastcgi가 단 하나의 프로세스 만 사용하도록 구성 할 수 있지만 확장 성에 영향을 미칩니 까?

PHP 또는 다른 해석 언어를 사용하는 모든 것이 올바르게 cgi 또는 fastcgi로 연결되기 때문에 비행하지 않습니다.

Memcache는 옵션 일 수 있다고 생각합니다.하지만 메모리에서 모든 것이 훨씬 빠르기 때문에 피하려고하는 다른 (로컬) 소켓 연결이 필요합니다.

해결책은 Windows 또는 Unix에서 작동 할 수 있습니다 ... 너무 중요하지 않습니다. 중요한 것은 많은 요청 (현재 100/초 및 1 년에 500/초까지 증가)이있을 것이고이를 처리하는 데 필요한 웹 서버의 양을 줄이려고합니다.

현재 솔루션은 PHP와 memcache (그리고 때때로 SQL 서버 백엔드에 대한 공격)를 사용하여 수행됩니다. 비록 (PHP 어쨌든) 빠르지 만 아파치는 50 초가 지나면 진짜 문제가있다.

현명한 선택을하기에 충분한 응답을 보지 못했기 때문에이 질문에 현상금을 넣었습니다.

현재 Asp.net 또는 fastcgi 중 C (++)를 고려 중입니다.

답변

5

앞으로 여러 개의 웹 서버를 사용하려는 경우 반드시 중앙 집중식 메모리 저장소를 사용해야하는 것처럼 메모리 내 키 - 값 데이터 저장소 (예 : Redis)를 사용해야합니다. Redis는 특히 목록, 집합 및 정렬 집합과 같은 고급 데이터 구조를 지원하므로이 시나리오에서 이상적입니다. 그것도 꽤 빠르며, 엔트리 레벨 리눅스 박스에서 110000 SET/초, 81000 GET/초를 얻을 수 있습니다. Check the benchmarks. 그 길로 가면 c# redis client에 접근을 단순화 할 수 있습니다.

공유 메모리를 사용하려면 동일한 프로세스에서 '항상 실행중인'응용 프로그램 서버가 필요합니다. 이러한 경우 정적 클래스 또는 공유 '응용 프로그램'캐시를 사용할 수 있습니다. 가장 많이 사용되는 '응용 프로그램 서버'는 모든 Java 서블릿 컨테이너 (예 : Tomcat) 또는 ASP.NET입니다.

이제 디스크가 아닌 메모리에 액세스하면 퍼포먼스가 중요 할 때 퍼포먼스가 크게 향상 될 것입니다. 인터 프리트 언어 사용을 고려하고 싶지 않을 것 같습니다. 요청, 네트워크 IO, 작업 스레드를 설정하는 프로토콜 해석 등은 항상 오버 헤드가 될 것입니다. 동일한 호스트에있는 프로세스를 사용하지 않기로 결정한 경우 메모리에 비해 공유 메모리는 무시할 수 있습니다. 요청을 완료하는 데 걸리는 전체 시간과의 비교 모든

+0

이 통찰력있는 답변에 감사드립니다. – Toad

1

첫째, 나에게 직접적인 질문에 당신과 함께 생각 해보자 :

을 - 당신이 목표로하고있는 성능을 위해, 내가 공유 메모리 액세스를 요구하는 조회 테이블이 것을 잔인한 말할 것입니다. 예를 들어 memcache 개발자는 예상되는 성능에 대해 다음과 같이 설명합니다. "초고속 네트워킹 (또는 로컬 액세스)이있는 고속 시스템에서 memcached는 초당 200,000 개 이상의 요청을 쉽게 처리 할 수 ​​있습니다."

- 모든 페이지를 동적으로 생성하므로 현재 cpu 시간 제한이 있습니다. 가능한 경우 : 캐시, 캐시, 캐시! 첫 페이지를 캐시하고 매분 5 분마다 한 번만 다시 작성하십시오. 로그인 한 사용자는 자신의 세션에서 다시 방문 할 수있는 사용자 별 페이지를 캐시합니다. 예 : 동적 페이지의 경우 50 초 요청이 너무 나쁘지 않은 경우 바니시와 같은 역방향 프록시는 정적 페이지의 thousands을 처리 할 수 ​​있습니다. . 두 번째 꽤 평범한 서버에 내 최고의 힌트 varnish 또는 squid를 사용하여 역방향 프록시 설정을 조사하는 것입니다

-. 당신은 여전히 ​​컴파일하는 것을 피하기 위해 php accelerator를 사용하여 동적으로 많은 페이지를 생성해야하는 경우 스크립트가 실행될 때마다 PHP 코드. ikipedia의 경우 2 배에서 10 배까지 성능이 향상됩니다.

- mod_php는 PHP를 실행하는 가장 빠른 방법입니다.

- fastcgi 사용 외에도 아파치 모듈을 작성하고 웹 서버 자체와 공유 메모리 공간에 데이터를 저장할 수 있습니다. 이것은 매우 빠를 수 있습니다. 그러나 성능 향상을 위해이 작업을 수행하는 사람은 들어 본 적이 없으며 매우 유연하지 못한 솔루션입니다.

- 더 정적 인 콘텐츠로 이동하거나 fastcgi 방식으로 이동하는 경우 : lighthttpd이 아파치보다 빠릅니다.

- 아직 충분히 빠르지 않습니까? TUX과 같은 in-kernel webservers은 매우 빠를 수 있습니다.


둘째 : 당신은 더 큰 물고기 중 일부는 친절하게도 우리와 함께 자신의 '트릭'을 공유 할 수 있습니다 다행히 처음이 문제가 발생 하나, 그리고 있습니다. 나는 이것이 당신의 질문의 범위를 벗어나는 것 같지만,이 사람들이 어떻게 문제를 해결했는지 알게 될 것입니다. 그리고 나는 저에게 알려진 자료를 공유하기로 결정했습니다.

facebook 아키텍처에서 this 프리젠 테이션을보고 flockr 디자인에 대한 몇 가지 노트가 포함 된 'scalable web-services 빌드'에 대한 this 프리젠 테이션을 살펴보십시오.

또한 페이스 북은 자신이 개발하여 기고 한 impressive toolset을 나열하고 또한 architecture에 메모를 공유합니다. 성능 향상 방법 중 일부는
- memcache-over-udp와 같이 성능 향상을 위해 memcache으로 사용자 정의 할 수 있습니다.
- hiphop은 php-optimized-C++ 컴파일러입니다. 페이스 북 엔지니어들은 50 %의 CPU 사용량 감소를 주장합니다.
- '빠른 언어'로 계산 집약적 인 서비스를 구현하고 thrift을 사용하여 모든 것을 하나로 연결하십시오.

+0

@ tumblecow : 귀하의 의견과 의견에 감사드립니다. 내가 제공하는 콘텐츠는 웹 페이지가 아니며 광고에 필적하는 것입니다. 매우 가벼우 긴하지만 프록시를 사용하여 캐시하는 것은 불가능합니다. 나는 facebook과 그들의 모든 도구를 들여다 보았습니다, 그들은 확실히 최전선에서 예술품의 상태를하고 있습니다. 나는 당신이 memcache에 대해 요점을 가지고 있다고 생각합니다. 로컬 네트워크에서 200k 연결을 처리 할 수 ​​있다면 외부 세계에서 예상되는 트래픽 양을 확실하게 처리 할 수 ​​있습니다. 이것은 내 질문에 어려움을 많이 줄일 수 ... – Toad

관련 문제