Cara mengatur batas cpu untuk proses yang diberikan secara permanen. Cpulimit dan baik tidak berhasil

12

Ada banyak pertanyaan serupa tetapi tidak ada yang membantu saya dengan masalah saya.

Saya memiliki ubuntu 11.10 di server (ini versi desktop). Saya memiliki situs web berjalan di atasnya. Ada satu proses yang sangat penting, tetapi tidak harus dijalankan dengan prioritas tinggi. Saya ingin membatasi penggunaan CPU untuk proses , bukan untuk pengguna. Proses ini dijalankan oleh fungsi exec (itu fungsi php, bukan proses sistem).

Jadi saya melihat 2 opsi: 1. Tambahkan semacam batas setiap fungsi waktu dijalankan. 2. Batasi penggunaan cpu secara permanen untuk proses ini.

Saya telah mencoba menggunakan "nice" dan cpulimit, tetapi sepertinya tidak ada yang berhasil. Nice tidak memiliki efek apa pun dan cpulimit (dengan -e) mengatakan: "tidak ada proses target yang ditemukan".

Saya seorang pemula, jadi anggaplah saya tidak tahu apa-apa.

Rafal
sumber
Bisakah Anda memberi tahu kami apa yang telah Anda coba. cgroup dapat melakukan ini untuk Anda.
Panther
Mengenai konfigurasi, Anda dapat menjalankan cgsnapshot -suntuk mengambil informasi tanpa menulis file konfigurasi secara manual, yang terakhir tidak direkomendasikan.
Mingliang Liu
Apakah Anda ingin benar-benar membatasi proses, yaitu memastikan bahwa prosesnya tidak pernah melebihi jumlah waktu yang ditentukan?
Ken Sharp
Saya menggunakan metode ini dan itu berhasil untuk saya .. ubuntuforums.org/showthread.php?t=992706
Mustafa Salman

Jawaban:

19

Dengan tidak adanya detail yang diminta ...

Inilah cara saya menggunakan cgroup di ubuntu.

Sepanjang posting ini, Anda perlu mengubah variabel "$ USER" ke pengguna yang menjalankan proses

Saya menambahkan informasi untuk memori dan juga akan menjadi FAQ, jika Anda tidak membutuhkannya, jangan menggunakannya.

1) Pasang cgroup-bin

sudo apt-get install cgroup-bin

2) Reboot. cgroups sekarang berada di/sys/fs/cgroup

3) Buat cgroup untuk pengguna Anda (pemilik proses)

# Change $USER to the system user running your process.
sudo cgcreate -a $USER -g memory,cpu:$USER

4) Pengguna Anda dapat mereka mengelola sumber daya. Secara default pengguna mendapatkan 1024 unit cpu (saham), jadi untuk membatasi hingga sekitar 10% CPU, memori dalam byte ...

# About 10 % cpu
echo 100 > /cgroup/cpu/$USER/cpu.shares

# 10 Mb
echo 10000000 > /cgroup/memory/$USER/memory.limit_in_bytes

5) Mulai proses Anda (ubah exec ke cgexec)

# -g specifies the control group to run the process in
# Limit cpu
cgexec -g cpu:$USER command <options> &

# Limit cpu and memory
cgexec -g memory,cpu:$USER command <options> &

Konfigurasi

Dengan asumsi cgroup bekerja untuk Anda;)

Edit /etc/cgconfig.conf, tambahkan cgroup khusus Anda

# Graphical
gksudo gedit /etc/cgconfig.conf

# Command line
sudo -e /etc/cgconfig.conf

Tambahkan cgroup Anda. Sekali lagi ubah $ USER ke nama pengguna yang memiliki proses.

group $USER {
# Specify which users can admin (set limits) the group
perm {    
    admin {
        uid = $USER;
    }
# Specify which users can add tasks to this group
    task {
        uid = $USER;
    }
}
# Set the cpu and memory limits for this group
cpu {
    cpu.shares = 100;
    }
memory {
    memory.limit_in_bytes = 10000000;
    }
}

Anda juga dapat menentukan grup gid=$GROUP, /etc/cgconfig.conf dikomentari dengan baik.

Sekarang jalankan lagi proses Anda dengan cgexec -g cpu:$USER command <options>

Anda dapat melihat proses Anda (dengan PID) di /sys/fs/cgroup/cpu/$USER/tasks

Contoh

bodhi @ ufbt: ~ $ cgexec -g cpu: bodhi sleep 100 &

[1] 1499

bodhi @ ufbt: ~ $ cat / sys / fs / cgroup / cpu / bodhi / tugas

1499

Untuk informasi tambahan, lihat: http://docs.redhat.com/docs/en-US/Red_Hat_Enterprise_Linux/6/html/Resource_Management_Guide/

Harimau kumbang
sumber
2
Saya berhasil menyelesaikan bagian 1. Ini berfungsi, tetapi Anda harus menambahkan informasi bahwa proses dibatasi hanya sementara beberapa proses lain membutuhkan cpu / memori. Tidak jelas - dan butuh waktu lama bagi saya untuk mencari tahu (karena saya pemula). Apakah saya mengerti benar bahwa "Konfigurasi" adalah untuk menyimpan pengaturan bahkan setelah reboot?
Rafal
1
Senang Anda mendapatkannya diurutkan. Ada sedikit kurva pembelajaran =) Ya, konfigurasi adalah menjaga pengaturan agar tetap booting.
Panther
Ketika saya menggunakan cgroup dari command line itu berfungsi dengan baik. Tetapi ketika saya menjalankan perintah yang sama dari fungsi exec di php: (<? Php exec ("cgexec -g cpu: GroupHere NameOfProcess InputFile OutputFile"); itu tidak berfungsi. Hanya perbedaannya adalah dari baris perintah saya menggunakan file yang ada di folder saya di dan dari php Saya menggunakan jalur panjang ke file-file itu.Ada tahu apa yang bisa menjadi masalah? Saya menggunakan pengguna yang sama dalam kedua kasus
Rafal
1
@ Rafal: Saya tidak komentar pertama Anda benar, memori harus dibatasi bahkan jika tidak ada proses lain yang mengambil banyak memori.
Flimm
1
@ Flimm Hanya 2 proses yang berjalan ketika saya menguji solusi ini - apache dan proses yang harus dibatasi. Ketika tidak ada koneksi apache naik atau hanya ada satu koneksi ke apache, proses terbatas itu memakan 100% cpu. Itu menjadi terbatas hanya sekali beberapa koneksi ke apache naik (saya melakukan ini dengan menyegarkan kembali situs web banyak dari browser web). Jadi mungkin itu adalah kasus tidak ada proses lain yang berjalan.
Rafal