Cara memeriksa penggunaan ulimit

29

Apakah ada cara untuk memeriksa penggunaan ulimit untuk pengguna tertentu? Saya tahu bahwa Anda dapat mengubah ulimits untuk satu proses ketika Anda memulai atau untuk satu shell saat menjalankan tetapi saya ingin dapat "memantau" seberapa dekat pengguna untuk mencapai batas mereka. Saya berencana menulis bashskrip yang akan melaporkan kembali ke statsd persentase penggunaan saat ini. Secara khusus, saya ingin melacak:

  1. buka file ( ulimit -n)
  2. proses pengguna maks ( ulimit -u)
  3. sinyal tertunda ( ulimit -i)

Yang saya inginkan adalah persentase penggunaan (0-100).

hazmat
sumber
jika proses akuntansi Anda dihidupkan di kernel, Anda dapat mengumpulkan statistik penggunaan rinci tentang pengguna Anda.
casey
Bagaimana Anda mengaktifkan proses akuntansi?
hazmat
Dan berapa banyak overhead yang ditambahkan?
hazmat

Jawaban:

22

Mungkin ini membantu untuk pertanyaan pertama:

Jika Anda mengetahui ID proses (PID) dari pengguna tertentu, Anda bisa mendapatkan batas untuk setiap proses dengan:

cat /proc/<PID>/limits

Anda bisa mendapatkan jumlah file yang dibuka untuk setiap PID dengan:

ls -1 /proc/<PID>/fd | wc -l

Dan kemudian bandingkan nilai Max open filesdengan jumlah deskriptor file terbuka dari perintah kedua untuk mendapatkan persentase.

m13r
sumber
8

Keluarkan persentase pengguna saat ini dari file terbuka, proc, dan sinyal yang tertunda, dengan beberapa metode yang tidak nyaman dan alat standar:

paste <(grep 'open files\|processes\|pending signals' /proc/self/limits | 
        cut -c27-38) \
      <(i=`whoami` ; lsof -u $i | tail -n +2 | awk {'print $9'} | wc -l; 
                     ps --no-headers -U $i -u $i u | wc -l ; 
                     ps -u $i -o pid= | xargs printf "/proc/%s/status\n" |
                                        xargs grep -s 'SigPnd' |
                                        sed 's/.*\t//' | paste -sd+ | bc ; ) |
while read a b ; do echo $((${b}00/a))%; done

Output pada sistem saya:

59%
9%
0%

Dengan asumsi angka-angka itu baik, apa yang ditunjukkan oleh jawaban ini adalah bahwa hal itu dapat dilakukan di shell, tetapi mungkin tidak boleh, kecuali ada metode shell yang jauh lebih baik. Sebaliknya, Q ini lebih baik dilakukan dengan gcc, atau python, dll.

agc
sumber
-4

Ulimit adalah properti dari proses dan diwariskan ke proses anak.

Anda tidak dapat memperoleh batasan untuk proses lain.

schily
sumber
2
Omong kosong. man lsof,, man ps...
Gilles 'SO- stop being evil'
1
Anda sepertinya salah paham bagaimana UNIX bekerja dan bagaimana ia mendapatkan hasilnya. lsof membaca memori kernel untuk mendapatkan nilai, tidak ada antarmuka terdokumentasi yang digunakan oleh lsof, jadi lsof akan gagal jika ada perubahan kecil pada struktur data kernel internal.
schily
2
Itu sakit kepala untuk lsofpengelola, tentu saja. Tetapi tidak relevan untuk pengguna akhir. Juga salah dalam konteks pertanyaan ini, karena menanyakan secara spesifik tentang Linux, yang memiliki antarmuka yang didokumentasikan ( man proc).
Gilles 'SO- stop being evil'
Anda berbicara tentang antarmuka tanpa dokumen yang dapat berubah tanpa pemberitahuan dalam kasus ini.
schily
1
Saya tidak bisa menghapuskan penyebab rendahnya rep saya jadi saya hanya akan berkomentar-1
Zun