문제

내 문제는 다음과 같습니다

많은 메모리를 사용하는 Perl 스크립트가 있습니다(캐싱으로 인해 예상되는 동작).그러나 캐싱을 많이 할수록 속도가 느려지고 프로세스가 대부분의 시간을 절전 모드에서 보낸다는 사실을 발견했습니다.

프로세스에 메모리를 미리 할당하면 성능이 향상될 수 있다고 생각했습니다.

누군가 여기에 어떤 아이디어가 있습니까?

업데이트:

나는 여기서 매우 명확하지 않다고 생각합니다.나는 더 명확한 방법으로 질문을 던질 것입니다:

나는 Perl 스크립트 내에서 사전 할당하는 방법을 찾고 있지 않습니다.나는 그것이 여기서 나에게 별로 도움이 될 것이라고 생각하지 않습니다.내가 관심 있는 것은 OS가 나중에 들어오는 다른 프로세스와 경쟁할 필요가 없도록 Perl 스크립트에 X 메모리 양을 할당하도록 OS에 지시하는 방법입니다.

메모리 사용량을 피할 수 없다고 가정합니다.하지만 이를 줄이는 방법도 모색 중이지만 그다지 개선될 것으로 기대하지는 않습니다.참고로 저는 솔라리스 10 머신에서 작업하고 있습니다.

도움이 되었습니까?

해결책

내가 당신의 게시물과 의견에서 수집 한 것은 다음과 같습니다.

  • 메모리 사용이 상승하면 프로그램이 느려집니다
  • 포그램은 컴퓨팅이 아니라 잠을자는 데 점점 더 많이 소요됩니다.

아마도 eplanation : 수면은 자원이 이용할 수 있기를 기다리는 것을 의미합니다. 이 경우 리소스는 아마도 메모리 일 가능성이 높습니다. vmstat 1 명령을 사용하여 확인하십시오. SR 열을 살펴보십시오. 일관되게 ~ 150을 넘어 서면 시스템은 수요를 충족시키기 위해 무료 페이지에 필사적입니다. 이것은 PI, PO 및 FR 열에서 높은 활동을 동반합니다.

이것이 사실이라면, 당신의 최선의 선택은 다음과 같습니다.

  • 수요를 충족시키기 위해 시스템 메모리 업그레이드
  • 현재 시스템의 레벨 적절한 것으로 메모리 사용량을 줄입니다.

Preallocating 메모리는 도움이되지 않습니다. 두 경우 모두 메모리 수요는 어느 시점에서 사용 가능한 기본 메모리를 초과합니다. 그런 다음 커널은 현재 메모리에 있어야하는 페이지를 결정하고 더 긴급히 필요한 페이지에 대해 어떤 페이지를 지울 수 있는지 결정해야합니다. 규칙적으로 필요한 모든 페이지 (작업 세트)가 기본 메모리의 크기를 초과하는 경우 시스템은 지속적으로 페이지를 보조 스토리지 (SWAP)로 이동합니다. 그런 다음이 시스템은 스 래싱 중이며 유용한 작업을하는 데 많은 시간을 소비하지 않습니다. 메모리를 추가하거나 덜 사용하는이 execept에 대해 할 수있는 일은 없습니다.

다른 팁

의견에서 :

메모리 제한은 그다지 심각하지는 않지만 메모리 발자국은 GBS로 쉽게 자랍니다. 메모리를위한 경쟁 프로세스가 있으면 매우 느립니다. 다른 프로세스가 너무 많은 경우에도 스 래싱이 최소화되도록 OS에서 메모리를 예약하고 싶습니다. Jagmal

그럼 다른 압정을 가져 가자. 특히 Perl 스크립트에 문제가되지는 않습니다. 대신, 기계의 모든 프로세스는 기계가 구성된대로 처리하기에 너무 많은 메모리를 소비합니다.

메모리를 "예약"할 수는 있지만 스 래싱을 방해하지는 않습니다. 실제로 OS가 메모리를 사용하고 있는지 또는 나중에 저장하는지 알지 못하기 때문에 문제를 악화시킬 수 있습니다.

나는 당신이 고통 받고 있다고 생각합니다 커먼즈의 비극. 다른 많은 사용자가 문제의 기계에있는 것이 맞습니까? 그렇다면 이것은 기술적 인 문제보다 사회적 문제입니다. 필요한 것은 시스템 관리자 (아마도 시스템 관리자)가 기계의 모든 프로세스를 조정하고 조정하는 것입니다. 그들은 가장 사치스러운 메모리 돼지를 찾아서 프로그래머와 협력하여 시스템 리소스 비용을 줄여야합니다. 또한 자원 할당이 효율적이되도록 프로세스를 예약해야합니다. 마지막으로, 예상 시스템 부하를 처리하려면 더 많은 또는 개선 된 하드웨어를 가져와야 할 수도 있습니다.

스스로에게 물어볼 수있는 몇 가지 질문 :

  • 내 데이터 구조가 당면한 작업에 정말 유용합니까?
  • 실제로 그렇게 많이 캐시해야합니까?
  • 얼마 후 캐시 된 데이터를 버릴 수 있습니까?
my @array;
$#array = 1_000_000; # pre-extend array to one million elements,
                     # http://perldoc.perl.org/perldata.html#Scalar-values

my %hash;
keys(%hash) = 8192; # pre-allocate hash buckets 
                    # (same documentation section)

코드에 익숙하지 않으면 서,이 기술이 스크립트에 새로운 큰 효율성을 제공하지는 않지만 사전 할당이 약간 도움이 될 수 있다는 점에서 거친 추측을 모험하게됩니다.

행운을 빕니다!

- 더글러스 헌터

나는 최근에 우수한 것을 재발견했다 Randal L. Schwartz 기사 여기에는 배열이 포함됩니다. 이것이 문제라고 가정하면 해당 코드의 변형으로 PrealLocation을 테스트 할 수 있습니다. 그러나 결과를 테스트하십시오.

더 많은 캐싱으로 스크립트가 느려지는 이유는 대패. 아마도 처음에 캐싱의 이유는 성능을 향상시키는 것입니다. 따라서 빠른 대답은 다음과 같습니다. 캐싱을 줄입니다.

이제 캐싱 체계를 수정하여 메인 메모리를 덜 사용하고 스 래싱을 피할 수있는 방법이있을 수 있습니다. 예를 들어, 메모리 대신 파일이나 데이터베이스로 캐싱하면 성능을 향상시킬 수 있습니다. 파일 시스템과 데이터베이스 캐싱이 응용 프로그램 캐싱보다 효율적 일 수 있으며 여러 인스턴스에서 공유 할 수 있음을 발견했습니다.

또 다른 아이디어는 다른 영역에서 메모리 사용량을 줄이기 위해 알고리즘을 변경하는 것입니다. 예를 들어, 전체 파일을 메모리로 끌어 당기는 대신 Perl 프로그램은 라인별로 더 잘 읽는 경향이 있습니다.

마지막으로, 당신은 탐색 했습니까? Memoize 모듈? 즉시 적용 할 수는 없지만 아이디어의 원천 일 수 있습니다.

아직 이 작업을 수행할 수 있는 방법을 찾을 수 없습니다.

그런데 알고보니 (참고 이것 자세한 내용은)

어휘에 할당된 메모리(예:내 () 변수)는 범위를 벗어나더라도 되 찾거나 재사용 할 수 없습니다.변수가 범위로 ​​돌아올 경우를 대비하여 예약됩니다.글로벌 변수에 할당 된 메모리는 undef () ing 및/또는 delete ()를 사용하여 (프로그램 내에서) 재사용 할 수 있습니다.

그래서 저는 주어진 시점에서 어휘 변수의 총 메모리 인쇄를 줄일 수 있는지 확인하는 것이 가능성이 있다고 믿습니다.

당신이 찾고있는 것처럼 들립니다 한계 또는 ulimit. 그러나 나는 그것이 한계를 넘어서 실패하는 스크립트를 일으킬 것이라고 생각합니다. 아마도 당신이 원하는 것이 아닐 것입니다.

더 나은 아이디어는 프로세스간에 캐시 된 데이터를 공유하는 것입니다. 데이터베이스 또는 파일에 데이터를 넣는 것은 내 경험에 잘 어울립니다.

나는 그것을 말하기를 싫어하지만, 당신의 기억 제한 이이 심각한 경우, Perl은 아마도이 응용 프로그램에 적합한 언어가 아닐 것입니다. C는 더 나은 선택이 될 것입니다.

당신이 할 수있는 한 가지는 Solaris Zones (컨테이너)를 사용하는 것입니다.
프로세스를 영역에 넣고 RAM 및 CPU와 같은 자원을 할당 할 수 있습니다.
다음은 일부 튜토리얼에 대한 두 가지 링크입니다.

  1. Solaris 컨테이너 안내 방법
  2. Solaris 10 08/07 OS의 영역 자원 제어

요청대로 사전 할당되지는 않지만 대형 페이지 크기 옵션을 살펴볼 수 있으므로 Perl이 프로그램에 대한 더 많은 메모리를 요청해야 할 때 더 큰 덩어리로 가져옵니다.

보다 Solaris Internals : 다중 페이지 크기 지원 차이점에 대한 자세한 내용과이를 수행하는 방법.

보다 http://metacpan.org/pod/devel::size

위의 작업을 수행하기 위해 AC 기능을 인라인으로도 할 수도 있습니다.

내가 아는 한, 당신은 Perl에서 직접 메모리를 할당 할 수 없습니다. XS 모듈을 작성하거나 언급 한 것처럼 인라인 C 기능을 사용하여이를 해결할 수 있습니다.

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