di mana nilai default ulimit ditetapkan? (linux, centos)

34

Saya memiliki dua server CentOS 5 dengan spesifikasi yang hampir sama. Ketika saya masuk dan melakukannya ulimit -u, di satu mesin saya dapatkan unlimited, dan di lain saya dapatkan 77824.

Ketika saya menjalankan cron seperti:

* * * * * ulimit -u > ulimit.txt

Saya mendapatkan hasil yang sama ( unlimited, 77824).

Saya mencoba menentukan di mana ini diatur sehingga saya bisa mengubahnya. Mereka tidak diatur dalam profil saya ( .bashrc, /etc/profile, dll). Ini tidak akan memengaruhi cron) maupun dalam /etc/security/limits.conf(yang kosong).

Saya telah menjelajahi google dan bahkan melakukan lebih jauh grep -Ir 77824 /, tetapi tidak ada yang muncul sejauh ini. Saya tidak mengerti bagaimana mesin ini bisa diatur dengan batas yang berbeda.

Saya sebenarnya bertanya-tanya bukan untuk mesin ini, tetapi untuk mesin (CentOS 6) yang berbeda yang memiliki batas 1024, yang terlalu kecil. Saya perlu menjalankan pekerjaan cron dengan batas yang lebih tinggi dan satu-satunya cara saya tahu cara mengaturnya adalah dalam pekerjaan cron itu sendiri. Tidak apa-apa, tapi saya lebih suka mengatur sistem itu lebar-lebar sehingga tidak seadanya.

Terima kasih atas bantuannya. Ini sepertinya mudah (BUKAN).


EDIT - ASK

Ok, saya sudah tahu ini. Tampaknya menjadi masalah dengan CentOS 6 atau mungkin konfigurasi mesin saya. Pada konfigurasi CentOS 5, saya dapat mengatur /etc/security/limits.conf:

* - nproc unlimited

dan itu akan secara efektif memperbarui batas akun dan cron. Namun, ini tidak berfungsi di kotak CentOS 6 saya. Sebaliknya, saya harus melakukan:

myname1 - nproc unlimited
myname2 - nproc unlimited
...

Dan semuanya berjalan seperti yang diharapkan. Mungkin spesifikasi UID berfungsi, tetapi wildcard (*) pasti TIDAK di sini. Anehnya, wildcard berfungsi dengan baik nofile.

Saya masih ingin tahu dari mana nilai-nilai default sebenarnya berasal, karena secara default, file ini kosong dan saya tidak bisa melihat mengapa saya memiliki standar yang berbeda untuk dua kotak CentOS, yang memiliki perangkat keras yang sama dan berasal dari penyedia yang sama .

nomercysir
sumber
3
Apakah Anda punya sesuatu /etc/security/limits.d/?
Patrick
Tidak, dir itu kosong
nomercysir
1
Anda dapat memposting jawaban sebagai jawaban aktual setelah periode tunggu tertentu.
sysadmin1138
2
Saya pernah melihat ini di suatu tempat. Standarnya diatur oleh kernel. Sebagian hard-coded, sebagian tergantung pada ram yang tersedia. Saya rasa saya menemukan bahwa pada Oracle Metalink dalam konteks pengaturan SLES10 untuk Oracle-DB 11.2
Nils
1
Bisakah pertanyaan ini ditandai sudah diselesaikan?

Jawaban:

45

Batas "default" ini diterapkan oleh:

  • yang kernel Linux pada saat booting (untuk initproses),
  • warisan , dari batas proses induk '(pada fork(2)saat itu),
  • PAM saat sesi pengguna dibuka (dapat menggantikan nilai-nilai kernel / warisan),
  • yang proses itu sendiri (dapat menggantikan nilai-nilai PAM & kernel / warisan, lihat setrlimit(2)).

Proses pengguna normal tidak dapat melampaui batas yang sulit.

Kernel Linux

Pada saat boot, Linux menetapkan batas default untuk initproses, yang kemudian diwarisi oleh semua proses (anak-anak) lainnya. Untuk melihat batas-batas ini: cat /proc/1/limits.

Sebagai contoh, default kernel untuk jumlah maksimum deskriptor file ( ulimit -n) adalah 1024/1024 (lunak, keras), dan telah dinaikkan menjadi 1024/4096 di Linux 2.6.39.

Jumlah maksimum proses default yang Anda bicarakan terbatas pada kira - kira:

Total RAM in kB / 128

untuk x86 arsitektur (setidaknya), tetapi distribusi kadang-kadang mengubah nilai default kernel, jadi memeriksa kode sumber kernel Anda untuk kernel/fork.c, fork_init(). Batas "jumlah proses" disebut RLIMIT_NPROC di sana.

PAM

Biasanya, untuk memastikan otentikasi pengguna saat masuk, PAM digunakan bersama dengan beberapa modul (lihat /etc/pam.d/login).

Pada Debian, modul PAM bertanggung jawab untuk menetapkan batas di sini: /lib/security/pam_limits.so.

Pustaka ini akan membaca konfigurasinya dari /etc/security/limits.confdan /etc/security/limits.d/*.conf, tetapi bahkan jika file-file itu kosong, pam_limits.so mungkin menggunakan nilai - nilai hardcoded yang dapat Anda periksa dalam kode sumber.

Misalnya, pada Debian, pustaka telah ditambal sehingga secara default, jumlah maksimum proses ( nproc) tidak terbatas, dan jumlah maksimum file ( nofile) adalah 1024/1024:

  case RLIMIT_NOFILE:
      pl->limits[i].limit.rlim_cur = 1024;
      pl->limits[i].limit.rlim_max = 1024;

Jadi, periksa kode sumber modul PAM CentOS Anda (cari RLIMIT_NPROC).

Namun, harap dicatat bahwa banyak proses tidak akan melalui PAM (biasanya, jika tidak diluncurkan oleh pengguna yang masuk, seperti daemon dan mungkin pekerjaan cron).

Totor
sumber
Benar, poin yang diambil, komentar dihapus. Saya kira saya akan mengatakan bahwa untuk sebagian besar pengguna, PAM mungkin diaktifkan, jadi saya akan merekomendasikan memeriksa file /etc/security/limits.conf Anda dan /etc/security/limits.d/* terlebih dahulu. Dalam contoh khusus ini, yang saya juga temui, ada 1024 proses / total batasan utas pengguna yang dipaksakan secara default di CentOS 6 melalui file limit.d.
rogerdpack
@rogerdpack ya, PAM sudah pasti diaktifkan, tetapi, sekali lagi, seperti yang saya katakan dalam jawaban saya: "harap dicatat bahwa banyak proses tidak akan melalui PAM (biasanya, jika mereka tidak diluncurkan oleh pengguna yang masuk, seperti daemon dan mungkin cron pekerjaan) ". Diskusi kami tidak memiliki nilai tambah, oleh karena itu, jika Anda menghapus semua komentar Anda, saya akan menghapus komentar saya. Terima kasih.
Totor
Distribusi SuSE memiliki paket ulimit yang menyediakan /etc/initscript- "tempat yang nyaman untuk menyesuaikan per batas proses", dapat dikonfigurasi melalui /etc/sysconfig/ulimit.
sendmoreinfo
juga, pustaka Linux-PAM membaca batas yang ditentukan oleh kernel (yaitu /proc/1/limits) sejak versi 1.1.4 (dirilis 2011).
sendmoreinfo
@sendmoreinfo dan apa yang dilakukan oleh perpustakaan Linux-PAM dengan batasan yang ditentukan oleh kernel selain dari membacanya?
Totor
15

Pada RHEL6 (CentOS6) "proses pengguna maks" diatur ke 1024 secara default.
Anda dapat mengubah nilai ini dalam file:

/etc/security/limits.d/90-nproc.conf

Lihat https://bugzilla.redhat.com/show_bug.cgi?id=432903 jika Anda ingin mengeluh tentang hal itu :)

Tomas
sumber
Saya ragu nilai 1024 untuk nproc ini benar dan penulis mengatakan bahwa batasan.d dirnya kosong, sehingga nilai defaultnya jelas tidak didefinisikan di sana.
Totor
Totor tidak dapat berdebat dengan Anda secara teknis tetapi Tom saya merasa sangat membantu, terima kasih!
Sebagian Mendung
3

Ketika Anda memeriksa batasan, apakah Anda menggunakan root untuk melakukannya?

Dari halaman limits.confmanual:

CATATAN: batas grup dan wildcard tidak diterapkan untuk pengguna root. Untuk menetapkan batas untuk pengguna root, bidang ini harus berisi root nama pengguna literal.

Menggunakan nama pengguna eksplisit akan menyelesaikan masalah dalam kasus ini.

Christopher Cashell
sumber
Hati-hati, ini mungkin "fitur" khusus Debian .
Totor
Juga, limits.conffile tersebut kosong (sebagai limits.ddirektori).
Totor
3

Info tentang ini sangat buruk di internet, ini file files.conf yang saya buat untuk debian linux, menunjukkan semua opsi yang mungkin dan batas maksimum "aman" mereka, atur sesuai kebutuhan.

Ini adalah nilai tertinggi yang dapat Anda tetapkan, beberapa hal di-hash, mengaktifkan hal itu menyebabkan Anda melakukan kesalahan dan tidak dapat masuk ke konsol Anda, mengubah opsi yang dikomentari dengan risiko Anda sendiri, tetapi Anda tidak perlu (defaultnya tidak terbatas) kebanyakan)

Saya harap ini bermanfaat bagi seseorang, karena saya tidak dapat menemukan info ini di mana pun, ada 4 jam penelitian pada file ini.

==== FILE START =====
# /etc/security/limits.conf
# 
#Each line describes a limit for a user in the form:
#
#<domain>        <type>  <item>  <value>
#
#Where:
#<domain> can be:
#- a user name
#- a group name, with @group syntax
#- the wildcard     *, for default entry
#- the wildcard %, can be also used with %group syntax,
#         for maxlogin limit
#- NOTE: group and wildcard limits are not applied to     root.
#  To apply a limit to the     root user, <domain> must be
#  the literal username     root.
#
#<type> can have the two values:
#- "soft" for enforcing the soft limits
#- "hard" for enforcing hard limits
#
#<item> can be one of the following:
#- core - limits the core file size (KB)
#- data - max data size (KB)
#- fsize - maximum filesize (KB)
#- memlock - max locked-in-memory address space (KB)
#- nofile - max number of open files
#- rss - max resident set size (KB)
#- stack - max stack size (KB)
#- cpu - max CPU time (MIN)
#- nproc - max number of processes
#- as - address space limit (KB)
#- maxlogins - max number of logins for this user
#- maxsyslogins - max number of logins on the system
#- priority - the priority to run user process with
#- locks - max number of file locks the user can hold
#- sigpending - max number of pending signals
#- msgqueue - max memory used by POSIX message queues (bytes)
#- nice - max nice priority allowed to raise to values: [-20, 19]
#- rtprio - max realtime priority
#- chroot - change     root to directory (Debian-specific)
#
#<domain>      <type>  <item>         <value>
#

#*               soft    core            0
#root            hard    core            100000
#*               hard    rss             10000
#@student        hard    nproc           20
#@faculty        soft    nproc           20
#@faculty        hard    nproc           50
#ftp             hard    nproc           0
#ftp             -       chroot          /ftp
#@student        -       maxlogins       4

# -- Defaults:
#(core) core file size                (blocks, -c) 0 (ulimit -Hc or -Sc)
#(data) data seg size                  (bytes, -d) unlimited
#(priority) scheduling priority               (-e) 0
#(fsize) file size                    (blocks, -f) unlimited
#(sigpending) pending signals                 (-i) 378197
#(memlock) max locked memory          (kbytes, -l) 64
# max memory size                     (kbytes, -m) unlimited
#(nofile) open files                          (-n) 65536
# pipe size                        (512 bytes, -p) 8
#(msgqueue) POSIX message queues       (bytes, -q) 819200
#(rtprio) real-time priority                  (-r) 0
#(stack) stack size                   (kbytes, -s) 8192
#(cpu) cpu time                      (seconds, -t) unlimited
#(nproc) max user processes                   (-u) 378197
# virtual memory                      (kbytes, -v) unlimited
#(locks) file locks                           (-x) unlimited

# --     root Limits:
root               -    core            -1
root               -    data            -1
root               -    fsize           -1
root               -    memlock         -1
root               -    nofile          999999
root               -    stack           -1
root               -    cpu             -1
root               -    nproc           -1
root               -    priority        0
root               -    locks           -1
root               -    sigpending      -1
root               -    msgqueue        -1
root               -    rtprio          -1
root               -    maxlogins       -1
root               -    maxsyslogins    -1
#root               -    rss             -1
#root               -    as              -1
#root               -    nice            0
#root               -    chroot          -1

#All Users:
# -- Hard Limits
*               hard    core            -1
*               hard    data            -1
*               hard    fsize           -1
*               hard    memlock         -1
*               hard    nofile          999999
*               hard    stack           -1
*               hard    cpu             -1
*               hard    nproc           -1
*               hard    priority        0
*               hard    locks           -1
*               hard    sigpending      -1
*               hard    msgqueue        -1
*               hard    rtprio          -1
*               hard    maxlogins       -1
*               hard    maxsyslogins    -1
#*               hard    rss             -1
#*               hard    as              -1
#*               hard    nice            0
#*               hard    chroot          -1

# -- Soft Limits
*               soft    core            -1
*               soft    data            -1
*               soft    fsize           -1
*               soft    memlock         -1
*               soft    nofile          999999
*               soft    stack           -1
*               soft    cpu             -1
*               soft    nproc           -1
*               soft    priority        0
*               soft    locks           -1
*               soft    sigpending      -1
*               soft    msgqueue        -1
*               soft    maxlogins       -1
*               soft    maxsyslogins    -1
*               soft    rtprio          -1
#*               soft    rss             -1
#*               soft    as              -1
#*               soft    nice            0
#*               soft    chroot          -1

#randomuser:
# -- Soft Limits
randomuser           soft    core            -1
randomuser           soft    data            -1
randomuser           soft    fsize           -1
randomuser           soft    memlock         -1
randomuser           soft    nofile          999999
randomuser           soft    stack           -1
randomuser           soft    cpu             -1
randomuser           soft    nproc           -1
randomuser           soft    priority        0
randomuser           soft    locks           -1
randomuser           soft    sigpending      -1
randomuser           soft    msgqueue        -1
randomuser           soft    maxlogins       -1
randomuser           soft    maxsyslogins    -1
randomuser           soft    rtprio          -1
#randomuser           soft    rss             -1
#randomuser           soft    as              -1
#randomuser           soft    nice            0
#randomuser           soft    chroot          -1

# End of file
XionicFire
sumber
2

kernel / fork.c

max_threads = mempages / (8 * THREAD_SIZE / PAGE_SIZE);

Pada 64 bit, ukuran Thread adalah 8192

 grep -i total /proc/meminfo 
 MemTotal:        8069352 kB

Sekarang saya mendapatkan total dalam kb di divisi oleh 4

 echo $((8069352/4))
 2017338

Sekarang saya mendapat jumlah halaman

 echo $((8 * 8192 / 4096)
 16

Hasil akhirnya adalah

echo $((2017338/16))
126083

Dengan cara ini Anda mendapatkan parameter thread-max dan batas proses pengguna default adalah setengah

init_task.signal->rlim[RLIMIT_NPROC].rlim_cur = max_threads/2;
init_task.signal->rlim[RLIMIT_NPROC].rlim_max = max_threads/2;

ulimit dari root

ulimit -u
62932
echo $((62932*2))
125864 #we are near
c4f4t0r
sumber
1

Tampaknya /etc/security/limits.conf

http://ss64.com/bash/limits.conf.html

jamesbtate
sumber
1
Saya sudah menyebutkannya di posting saya. Ini tidak berpengaruh, juga nilai-nilai itu (tidak terbatas, 77.824) ditetapkan di sana untuk mesin masing-masing (file itu kosong).
nomercysir
oh saya melihat Anda memeriksa .bashrc dll. tetapi tidak melihat Anda menyebutkan ini juga.
jamesbtate
1

Ada satu kemungkinan lagi bahwa konfigurasi untuk "noproc" tidak berfungsi saat mengkonfigurasi di /etc/security/limits.conf.

Ada satu file lagi yang menimpa konfigurasi /etc/security/limits.d/90-nproc.conf Anda.

* soft nproc 1024
root nproc lunak tak terbatas

Di sini * config akan menimpa apa pun yang Anda atur di file konfigurasi sebelumnya. Jadi idealnya Anda mengkonfigurasi pengaturan Anda di file ini.

Suyash Jain
sumber