Kabuk betiğine bellek sınırları nasıl uygulanır?


10

Bir klasör XML dosyaları içerirken, onları veritabanına işleyecek bir PHP komut dosyası var.

Şu anda, sunucu PHP 5.3.10 sürümünü çalıştırıyor ve bir döngü içinde tetiklenen bellek sorunları hakkında bir hata raporu var ZEND_MM_HEAP.

Bu, PHP'nin belleği düzgün şekilde boşaltmamasına neden olur, böylece bir hata ve komut dosyası çökmesine neden olur:

 zend_mm_heap is corrupted

Bazı çözümler bulundu, ancak sunucu ayarlarına erişimim yok.

Bununla başa çıkmak için, PHP komut dosyasını yalnızca XML dosyasını işleyerek sorumlu bırakarak, döngüye dikkat etmek için aşağıdaki bash betiğini hazırladım:

#!/bin/bash

# Check for files to process
# If files are present, call
# the PHP script

DIR="/path/to/dir/with/files"
while [ "$(ls -A $DIR)" ]; do
        php /path/to/php/script/myscript.php
done

Şimdi amacım bu bash bellek ayırmayı sınırlı tutmak (bellek ve sanal bellek), böylece bir şeyler ters giderse sistemin asılmasını önlemek.

Benim sorum:
Bu kabuk betiği tarafından kullanılan belleği belirli bir miktarla nasıl sınırlayabilirim?


1
Çalıştırarak belleğin ayrılma şeklini değiştirebildiğinizi lütfen unutmayın export USE_ZEND_ALLOC=0.
Pedro Cordeiro

Yanıtlar:


12

Aşağıdaki işlemleri yaparak bellek kullanımını Bash Script ile sınırlandırabilirsiniz.

Bellek kullanımını kb ile sınırlayın (bu örnekte 2 GB):

ulimit -m 2048000

Sanal bellek kullanımını sınırlayın:

ulimit -v 2048000

Sanal bellek sınırını sabit sınır olarak ayarlayın, böylece bu sınırı aştığınızda işlem öldürülür:

ulimit -H -v

Bence bu istediğini yapabilir.


1
Bu sınır alt süreçler için de geçerli mi? Örneğin, bu bash betiğinde bir erlang REPL üretirsem, bellek sınırı dayatılacak mı?
Christophe De Troyer

2
@ChristopheDeTroyer Sınır, alt süreçler tarafından devralınır, bu nedenle alt süreçler bunu aşamaz. Ancak bu sınır tüm işlem ağacına uygulanmaz.
karikatürist
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.