문제

서버에서 내 Perl 스크립트를 안정적으로 실행할 수 없습니다. 여기에 문제가 있습니다.

스크립트가 초당 5 배 이상 액세스되면 서버가 정지됩니다. 그리고 얼마 후 서버는 영원히 매달려 있습니다. SSH는 응답하지 않으며 서버를 다시 시작해야합니다.

Apache를 사용하고 있습니다 mod_perl.

이 스크립트는 Ubuntu의 가상 전용 서버에서 호스팅됩니다. SSH를 통해 작동하고 있습니다. 이들은 서버 매개 변수 CPU : 400MHz RAM : 256MB입니다.

스크립트의 최대 실행 시간은 200 밀리 초입니다.

"상단"유틸리티로 서버로드를 모니터링했습니다. 문제가 표시되지 않습니다. 이것은 초당 5 개의 스크립트로드 중 CPU 통계입니다.

Cpu(s): 12.1%us,  0.6%sy,  0.0%ni,  0.0%id,  0.0%wa,  0.0%hi,  0.0%si, 87.2%st

문제없이 스크립트를 작동시켜야하는 옵션은 무엇입니까?

이것이 결과입니다 ps aux | fgrep perl 로딩의 순간 :

ps aux | fgrep perl
www-data  2925  0.3  6.5  45520 17064 ?        R    17:00   0:01 /var/www/perl/loa -k start
www-data  2926  0.2  6.5  45520 17068 ?        R    17:00   0:01 /var/www/perl/loa -k start
www-data  2927  0.4  6.5  45676 17060 ?        R    17:00   0:01 /var/www/perl/loa -k start
www-data  2928  0.3  6.5  45676 17060 ?        R    17:00   0:01 /var/www/perl/loa -k start
www-data  2929  0.2  6.5  45676 17060 ?        R    17:00   0:01 /var/www/perl/loa -k start
www-data  2931  0.4  6.5  45740 17076 ?        R    17:00   0:01 /var/www/perl/loa -k start
root      2968  0.0  0.2   3196   656 pts/0    R+   17:06   0:00 fgrep perl

업데이트

병목 현상을 발견했습니다. 코드 주변에서 DateTime 모듈을 여러 번 사용하고 있습니다. 다음 DateTime 모듈 방법은 매우 느린 것으로 보입니다.

  • 새로운()
  • 지금()
  • 세트(...)
  • delta_ms (...)

나는 그것들을 빠른 아날로그로 대체 할 것입니다.

또 다른 관심사. mod_perl 인스턴스에는 많은 메모리가 필요합니다. 그리고 나는 이유를 모른다. 모듈을 가져 오지 않는 간단한 Perl 스크립트를 실행하려고했습니다. 아파치 재시작 직후에 실행합니다. 스크립트에는 37m의 메모리가 필요합니다. 왜 그런 일이 발생합니까? mod_perl을 강제로 사용하는 방법을 알고 있습니까? 추가 메모리를 사용하지 않습니까?

MOD_PERL 지원이없는 일반 PERL 스크립트는 3-5m의 메모리를 사용합니다.

여러분, 많은 도움을 주셔서 감사합니다. 나는 그런 훌륭한 응답을 기대하지 않았습니다!

업데이트 2

나는 하나 더 사실을 발견했다. 5 초 동안 기다리는 간단한 Perl 스크립트를 만들었습니다.

#!/usr/bin/perl
use CGI;

my $query= new CGI;
my $content = "5 second delay...\n";

$query->header(
    '-Content-type' => "text/plain",
    '-Content-Length' => length($content)
);

print $content;

sleep(5);

그런 다음이 스크립트를 동시에 스폰합니다. 최고 유틸리티의 스텔스 타임 (ST)은 0%에서 80%로 증가하고 스크립트가 완료 될 때까지 높게 유지됩니다.

이 부하는 어디에서 왔습니까?

또한 이미 언급했듯이 각 Perl 인스턴스에는 36m의 메모리가 필요합니다.

도움이 되었습니까?

해결책

당신의 숫자 top VM 외부의 다른 프로세스가 CPU를 조절하고 있음을 나타냅니다. 마지막 숫자에 주목하십시오. 87.2%st, VM에 실행하고 싶은 것이 있더라도 VM 이외의 작업에 대해 Hypervisor가 CPU 시간의 약 87%를 할당하고 있음을 나타냅니다. 이것이 당신의 문제와 관련이 있는지 여부는 말하기 어렵습니다.

제안대로 서버를 업그레이드하는 것 외에도 풀다, 제안대로 지속적인 프로세스 환경을 사용합니다 , 프로세스가 CPU가 전혀 구속되지 않는 것이 아니라 네트워크 나 디스크 액세스 또는 메모리 바운드와 같은 IO 바운드 일 수 있습니다. 스크립트가 호출 될 때 실제로하는 일에 대한 자세한 내용은 말하기가 어렵습니다.

편집하다: 각 프로세스가 45m의 RAM 자체를 원하고 17m를 더 공유하기 때문에 메모리 사용에 대한 정보가 포함 된 업데이트 된 질문이 드러납니다. 단지 5 개 또는 6 개의 프로세스 만 실행되면 사용 가능한 RAM의 양을 초과합니다. 그것은 바닐라 perl 스크립트를 사용할 수있는 많은 메모리입니다. 그것은 무엇을하고 있습니까?

다른 팁

그것은 매우 큰 서버가 아닙니다. 무릎을 꿇게하는 Perl 통역사를 산란 할 수 있습니까? Perl을로드 (행복하게 1MB 이상이라고 가정 함)는 2 초에 5 배가 너무 많이 요구할 수 있습니다.

물론 캐시해야하지만 실행하기 전에 여전히 초기화가 필요합니다.

오늘날의 표준에 따라 서버의 사양은 인상적이지 않지만 비슷한 하드웨어에서 동시에 상당히 복잡한 물건을 실행했습니다. 그러나 나는 매우 베어 본을 사용했고, FreeBSD 구성이 필요한 것만 실행했습니다. (Archlinux를 사용하여 달성 할 수있는 것과 유사합니다). 나는 당신이 많은 사용자 정의 구성을하지 않았고, 그 사양에 비해 너무 무거울 수있는 우분투 기본값을 받아 들였다고 생각합니다.

현재 저는 Linode 360을 가지고 놀고 있으며 성능은 괜찮습니다.

이제이 모든 것은 명백한 것을 말하기위한 것입니다. 우리는 귀하가 우리와 공유하지 않은 정보가 필요합니다. 웹 서버 구성, 스크립트 + 인터프리터의 메모리 풋 프린트, 열린 파일 수 등.

업데이트: 이제 당신이 사용하고있는 것을 보았습니다 mod_perl: 1) 스크립트에 필요한 모든 라이브러리가 서버 시작시 소개되었는지 확인 했습니까? 2) 당신은 무엇이든 받고 있습니까? variable won't stay shared 로그의 메시지? 3) 읽었어요 mod_perl 성능? (10 장 : 메모리 공유 특히 관련이있을 수 있습니다).

일반적으로 Apache 서버의 시작시 공통 라이브러리를 사전로드해야합니다. 매우 단순화 된 경험 법칙으로, 더 많은 물건이 공유 될수록 서버에서 더 많이 나올 수 있습니다. 보다 시작 파일 안에 실용적인 mod_perl.

또한 서버 당 35MB가 조금 많다고 생각합니다. Apache 구성에서 불필요한 모듈을 제거하면이를 줄일 수 있다고 생각합니다. 그러나 35MB가 공유되는 모든 것을 모두 공유 할 수없고 최대 아동 프로세스는 50MB라고 말하면 한 번에 약 20 명의 고객을 수용 할 수 있어야합니다.

방금 테스트중인 스크립트를 발견했습니다. 실제로, 예압을 시도하십시오 CGI 다음 줄을 추가하여 서버 시작시 startup.pl:

use strict;
use warnings;

use CGI();

둘째, 그 대본을 변경하십시오

#!/usr/bin/perl

use strict;
use warnings;
use CGI ();

$| = 1;

handle_request();

sub handle_request {
    my $cgi = CGI->new;

    my $content = "5 second delay...\n";

    print $cgi->header('text/plain'), $content;

    sleep(5);
}

원본 스크립트에서 헤더를 보내지 않았다는 점에 유의하십시오 (나는 또한 CGI 사례 $query 그래서 나는 그것을 바꾸는 자유를 얻었습니다). 또한보십시오 Perl Reference.

그 후 메모리 사용을 다시보고하십시오.

마지막으로, 왜 5 초 동안 자고 있습니까? Afaik, 스크립트의 Apache의 기본 시간 초과는 3 초입니다.

스크립트는 어떤 종류의 인터페이스를 사용합니까? 실행을 피할 수 있다면 확실히 더 나은 성능을 얻을 수 있습니다. perl 예를 들어 사용하여 계속 실행 가능합니다 Fastcgi.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top