çalışan bir prosedüre ulimit ayarı


25

Bir sunucu uygulaması başlattım ve test amacıyla uzun süre çalıştırmak istiyorum. Ne yazık ki, daha önce ulimit -c unlimitedmeydana gelen bir kazayı yakalamak ve incelemeyi unutmayı unuttum . Yapabileceğim bir şey var mı?

Yanıtlar:


39

Linux'un son sürümlerinde (2.6.36'dan beri), prlimitkaynak sınırlarını isteğe bağlı bir işlemde belirlemek için komut ve sistem çağrısını kullanabilirsiniz (uygun izinler verilir):

$ prlimit --core=unlimited: --pid $$
$ prlimit --core --pid $$
RESOURCE DESCRIPTION             SOFT      HARD UNITS
CORE     max core file size unlimited unlimited blocks

Sen prlimit komutu için linux-2.21-util gerekmez, ancak çağırmak için birlikte hızlı bir programı atmak gerekir prlimit sistemi çağrıyı aksi:

int prlimit(pid_t pid, int resource, const struct rlimit *new_limit, struct rlimit *old_limit);

Yeterince yeni bir Linux sürümünüz (veya başka bir işletim sistemi) yoksa, bildiğim tek düzeltme işlemle bağlantı kurmak gdbve setrlimithata ayıklayıcıdan vermektir:

$ gdb -p $PID
...
(gdb) set $rlim = &{0ll, 0ll}
(gdb) print getrlimit(9, $rlim)
$1 = 0
(gdb) print *$rlim
$2 = {-1, -1}
(gdb) set *$rlim[0] = 1024*1024
(gdb) print setrlimit(9, $rlim)
$3 = 0

Bu ayarı içindir ulimit -m, RLIMIT_AS = 9; aynısı için de geçerlidir ulimit -c( RLIMIT_CORE, 4Linux’taki x86-64’deki sayısal değer ). "Sınırsız" için RLIM_INFINITYgenellikle kullanın -1. /usr/include/bits/types.hBoyutunun ne olduğunu kontrol etmelisiniz rlim_t; Sanırım long long(aslında imzasız, ancak imzalı bir tür kullanmak "sınırsız" -1 okunmasını kolaylaştırıyor).


+1 Bu gdbteknik gerçekten harika. Bir uyarı, kök sınırını aşmayan köklü bir işlem için açık dosya sayısını artıramayacağınız görülüyor , setrlimitçağrı -1 döndürür ve errno 22'dir (geçersiz argüman).
Steve Kehlet

2

Ubuntu 14.04 Trusty util-linux-2.21 olmadığından (2.20'dir), prlimitkullanılacak CLI komutu yoktur .

Python3.4 + 'ı kullanarak (Ubuntu 14.04 ve sonraki sürümlerde kullanılabilir) çalışan bir işlem için kaynak sınırını belirleyebilir. Kök olarak çalıştır:

1-astar:

# PID=966
# grep 'open file' /proc/$PID/limits
Max open files            1024                 4096                 files     
# python3 -c "import resource; resource.prlimit($PID, resource.RLIMIT_NOFILE, (2048, 12345))"
# grep 'open file' /proc/$PID/limits
Max open files            2048                 12345                files   

Veya daha fazla ayrıntılı:

# python3
Python 3.4.3 (default, Nov 28 2017, 16:41:13) 
[GCC 4.8.4] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import resource
>>> import os
>>> resource.prlimit(os.getpid(), resource.RLIMIT_NOFILE)
(1024, 4096)
>>> resource.prlimit(os.getpid(), resource.RLIMIT_NOFILE, (1369, 9999))
(1024, 4096)
>>> resource.prlimit(os.getpid(), resource.RLIMIT_NOFILE)
(1369, 9999)

İşe yaradığını doğrulayın:

# grep 'open file' /proc/1472/limits 
Max open files            1369                 9999                 files 

Bunun Linux 2.6.36 veya üstü ile çalıştığını ve glibc 2.13 veya üstü ile çalıştığını unutmayın.

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.