Linux (belum) mengikuti standar POSIX.1 yang mengatakan bahwa renice
pada suatu proses mempengaruhi "semua utas lingkup sistem dalam proses", karena menurut pthreads (7) doc "utas tidak berbagi nilai bagus yang sama".
Namun, kadang-kadang, akan lebih mudah untuk renice
"semuanya" terkait dengan proses yang diberikan (salah satu contohnya adalah proses anak Apache dan semua utasnya). Begitu,
- bagaimana saya bisa
renice
semua utas menjadi bagian dari proses yang diberikan? - bagaimana saya
renice
semua proses anak milik proses yang diberikan?
Saya mencari solusi yang cukup mudah.
Saya tahu bahwa kelompok proses kadang-kadang bisa membantu, namun, mereka tidak selalu cocok dengan yang ingin saya lakukan: mereka dapat mencakup serangkaian proses yang lebih luas atau berbeda.
Menggunakan cgroup
dikelola oleh systemd
mungkin juga bermanfaat, tetapi bahkan jika saya tertarik untuk mendengarnya, saya kebanyakan mencari solusi "standar".
EDIT: juga, man (7) pthreads
mengatakan "semua utas dalam suatu proses ditempatkan dalam grup utas yang sama; semua anggota grup utas berbagi PID yang sama". Jadi, apakah mungkin untuk renice
sesuatu yang tidak memiliki PID sendiri?
man (7) pthreads
mengatakan tentang implementasi saat ini (NPTL): "semua utas dalam suatu proses ditempatkan dalam grup utas yang sama; semua anggota grup utas berbagi PID yang sama" dan "Utas tidak berbagi nilai bagus yang sama". Lalu, bagaimana Anda bisa mengganti utas yang tidak memiliki PID sendiri, saatrenice
menggunakan PID untuk melakukannya?24995 (process ID) old priority 0, new priority -10
. 24995 tidak munculps
, jadi itu bukan proses. Mungkin mengganti benang benar-benar berfungsi?Nilai bagus atau pembagian CPU?
Harap dicatat bahwa saat ini, nilai yang bagus mungkin tidak begitu relevan "seluruh sistem", karena pengelompokan tugas otomatis, terutama ketika menggunakan systemd . Silakan lihat jawaban ini untuk lebih jelasnya.
Perbedaan antara utas dan proses
Pertanyaan penting di Linux, karena dokumentasi melanggengkan keraguan (tentang utas yang tidak memiliki PID sendiri misalnya).
Catatan: jawaban ini menjelaskan thread Linux dengan tepat.
Singkatnya: kernel hanya menangani "entitas yang dapat dijalankan ", yaitu sesuatu yang dapat dijalankan dan dijadwalkan . Kernel bijaksana, entitas ini disebut proses. Utas, adalah sejenis proses yang berbagi (setidaknya) ruang memori dan penangan sinyal dengan yang lain.
Setiap proses tersebut memiliki pengidentifikasi unik seluruh sistem: PID (Process ID). Untuk apa yang disebut utas, terkadang disebut TID (Utas ID), tetapi dari sudut pandang sysadmin (dan kernel!), TID dan PID adalah hal yang sama (mereka berbagi namespace yang sama).
Hasilnya, Anda dapat
renice
masing - masing "utas" secara individual karena mereka memiliki PID 1 mereka sendiri .Menemukan semua PID
renice
secara rekursifKita perlu mendapatkan PID dari semua proses ("normal" atau "utas") yang merupakan turunan (anak-anak atau dalam grup utas) dari proses yang akan dilakukan. Ini harus bersifat rekursif (mempertimbangkan anak-anak anak-anak).
Jawaban Anton Leontiev memberikan petunjuk untuk melakukannya: semua nama folder
/proc/$PID/task/
adalah PID utas yang berisichildren
file yang berisi daftar proses anak-anak yang potensial.Namun, ini kurang berulang, jadi inilah skrip shell cepat & kotor untuk menemukannya:
Jika proses PID 1234 adalah yang Anda inginkan secara rekursif bagus, sekarang Anda dapat melakukannya:
1 Perhatikan bahwa, untuk kepatuhan POSIX, panggilan
getpid(2)
dalam utas tidak akan memberi Anda ID unik (PID) seluruh sistem dari entitas yang dapat dijalankan ini, melainkan PID dari proses utama dalam "grup utas". Anda harus menelepongettid(2)
saja. Lihat jawaban ini untuk informasi lebih lanjut.sumber
Kita seharusnya tidak membingungkan proses PID dan id utas kadang ditulis TID atau dalam perintah ps LPW. The
s
perintah memiliki pilihan untuk benang layar, dan di bawahtop
atauhtop
Anda beralih antara benang dan proses denganH
surat. Seperti yang diceritakan sebelumnya oleh @Totor, dengan NPTL, yang merupakan implementasi saat ini dengan kernel> 2.6, semua utas memiliki pid yang sama, tetapi mereka memiliki tid yang berbeda. Anda menunjukkan semua utas proses dengan:Ini adalah nama-nama direktori di bawah
/proc/<pid>/task
, dan bahkan jika renice (1) mengatakan bahwa argumen defaultnya adalah pid ketika diterapkan pada pid, ia hanya mengganti utas utama (ini adalah bug dalam implementasi linux seperti yang ditulis dalam setpriority (2 ) ), itu juga dapat diterapkan pada tid dan itu mengubah nama utas. Itulah mengapa jawaban @Anton valid.Tetapi paling sering ada cara yang lebih mudah untuk mencapai hasil yang diinginkan, semua utas ini berbagi pgid yang sama yang merupakan pid dari pemimpin kelompok; Anda dapat mengganti nama dengan pgid dengan menerbitkan:
Jika Anda tidak ingin mengubah proses lain yang bergantung pada pemimpin grup yang sama, Anda harus menggunakan resep @ Anton:
atau:
Anda mungkin juga ingin tahu apa saja proses lain dari grup yang sama dari proses yang ingin Anda renice, yaitu proses yang berbagi memiliki pgid yang sama. Anda dapat menggunakan ps (1) ,
ps
tidak memungkinkan untuk memilih proses oleh ketua grup, tetapi Anda dapat memintaps
untuk melakukannya. Proses dengan pgid1908
akan diberikan oleh perintah:atau jika Anda lebih suka awk daripada sed:
sumber
$ renice -n 18 -g 8524 renice: failed to get priority for 8524 (process group ID): No such process $ ps --no-header axo pid,pgid|awk '{if ($2=="8524") print $1;}'
Sedangkan metode Totor masih / masih berfungsi:$ /bin/ls /proc/8524/task | /usr/bin/xargs renice 19 2739 (process ID) old priority 19, new priority 19 2740 (process ID) old priority 19, new priority 19 ...
Saya sudah mengkonfirmasi dengan / proc, htop, pstree, dll. Bahwa saya memang memiliki top- top yang benar PID tingkat. Mungkin ada yang berubah dalam satu tahun terakhir./proc/8524/task
tetapirenice -g
gagal. Saat Anda melihat pohon proses, satu cabang berada di grup proses yang sama, tidak hanya satu proses berulir. Coba lagi periksa hasilps -Ljf
.Saya ingin merekomendasikan menggunakan argumen -g (grup proses) alih-alih -p (proses id) saat menggunakan renice. Itu melakukan hal yang sama tanpa bash-foo.
yaitu
sumber
Berikut ini skrip saya:
sumber