GNU/Linux >> Belajar Linux >  >> Linux

Linux – Mengatur Proses Menjalankan Afinitas Dengan Taskset Gagal?

Saya mencoba membatasi proses ke sejumlah inti CPU tertentu. Menurut halaman manual taskset dan dokumentasi ini, berikut ini seharusnya berfungsi:

[[email protected] ~]$ taskset -pc 0 <PID>
pid 24395's current affinity list: 0-3
pid 24395's new affinity list: 0

Sederhananya - ini tidak berhasil. Menempatkan proses di bawah beban dan menonton top , itu duduk sekitar 350% penggunaan CPU (sama seperti tanpa taskset). Seharusnya maksimal 100%.

Saya dapat mengatur afinitas dengan benar melalui taskset -c 0 <cmd to start process> pada waktu pemijahan proses. Menggunakan cpulimit -p <PID> -l 99 juga agak-bekerja. Dalam kedua kasus, menempatkan proses di bawah beban yang sama menghasilkan penggunaan CPU maksimal 100%.

Ada apa di sini?

Jawaban yang Diterima:

Pembaruan:Versi tugas yang lebih baru memiliki -a /--all-tasks opsi yang "beroperasi pada semua tugas (utas) untuk pid tertentu" dan harus menyelesaikan perilaku yang saya tunjukkan di bawah ini.

Saya menulis skrip Python yang hanya memutar beberapa utas dan membakar siklus CPU. Idenya adalah untuk menguji kumpulan tugas, karena ini cukup sederhana.

#!/usr/bin/env python

import threading

def cycle_burner():
    while True:
        meh = 84908230489 % 323422

for i in range(3):
    thread = threading.Thread(target=cycle_burner)
    print "Starting a thread"
    thread.start()

Menjalankan skrip Python saja menghabiskan sekitar 150% penggunaan CPU.

[~/cbench]$ ./burn_cycles.py
Starting a thread
Starting a thread
Starting a thread

Meluncurkan skrip Python saya dengan taskset berfungsi seperti yang diharapkan. Menonton bagian atas menunjukkan proses Python yang dipatok pada penggunaan 100%.

[~/cbench]$ taskset -c 0 ./burn_cycles.py
Starting a thread
Starting a thread
Starting a thread

Menariknya, meluncurkan skrip Python dan kemudian segera menggunakan set tugas untuk mengatur afinitas proses yang baru dimulai membatasi proses pada 100%. Perhatikan dari output bahwa penjadwal Linux selesai menjalankan perintah Bash sebelum memunculkan utas Python. Jadi, proses Python dimulai, kemudian disetel untuk berjalan pada CPU 0, lalu memunculkan utasnya, yang mewarisi afinitas yang tepat.

[~/cbench]$ ./burn_cycles.py &; taskset -pc 0 `pgrep python`
[1] 8561
pid 8561's current affinity list: 0-3
pid 8561's new affinity list: 0
Starting a thread
[~/cbench]$ Starting a thread
Starting a thread

Hasil itu kontras dengan metode ini, yang persis sama tetapi memungkinkan utas Python muncul sebelum mengatur afinitas proses Python. Ini mereplikasi hasil "set tugas tidak melakukan apa-apa" yang saya jelaskan di atas.

[~/cbench]$ ./burn_cycles.py &
[1] 8996
[~/cbench]$ Starting a thread
Starting a thread
Starting a thread
[~/cbench]$ taskset -pc 0 `pgrep python`
pid 8996's current affinity list: 0-3
pid 8996's new affinity list: 0

Ada apa di sini?

Rupanya utas yang muncul sebelum afinitas proses induk diubah tidak mewarisi afinitas induknya. Jika seseorang dapat mengedit dalam tautan ke dokumentasi yang menjelaskan hal ini, itu akan sangat membantu.

Terkait:menambahkan teks ke nama file sebelum ekstensi?
Linux
  1. Linux – Bagaimana Cara Mengatur Afinitas Prosesor Suatu Proses Di Linux?

  2. Bagaimana cara mematikan proses yang berjalan pada port tertentu di Linux?

  3. Mengapa menjalankan perintah shell Linux dengan '&'?

  1. Bagaimana saya bisa mengatur afinitas prosesor dari suatu proses di Linux?

  2. Menyetel afinitas proses yang berjalan dengan kumpulan tugas gagal

  3. Proses yang berjalan di latar belakang terbunuh di linux

  1. Bagaimana Cara Memulai Ulang (atau Mengatur Ulang) Proses yang Berjalan Di Linux?

  2. Penanganan sinyal dengan banyak utas di Linux

  3. Menyiapkan subdomain dengan Apache di Linux