Cách đặt giới hạn cpu cho quy trình nhất định vĩnh viễn. Cpulimit và tốt đẹp không làm việc


12

Có nhiều câu hỏi tương tự nhưng không ai trong số họ giúp tôi giải quyết vấn đề của mình.

Tôi có Ubuntu 11.10 trên máy chủ (phiên bản dành cho máy tính để bàn). Tôi có một trang web đang chạy trên đó. Có một quy trình rất quan trọng, nhưng không cần phải được ưu tiên cao. Tôi muốn giới hạn vĩnh viễn việc sử dụng cpu cho quá trình , không phải cho người dùng. Quá trình này được chạy bởi chức năng exec (đó là chức năng php, không phải quy trình hệ thống).

Vì vậy, tôi thấy 2 tùy chọn: 1. Thêm một số loại giới hạn mỗi khi hàm được thực thi. 2. Hạn chế sử dụng cpu vĩnh viễn cho quá trình này.

Tôi đã cố gắng sử dụng "tốt đẹp" và cpulimit, nhưng dường như không có gì để làm việc. Nice không có bất kỳ ảnh hưởng nào và cpulimit (với -e) nói: "không tìm thấy quá trình mục tiêu".

Tôi là một người mới bắt đầu, vì vậy xin vui lòng giả sử tôi gần như không biết gì.


Bạn có thể vui lòng cho chúng tôi biết những gì bạn đã cố gắng. cgroups có thể làm điều này cho bạn.
Panther

Đối với cấu hình, bạn có thể chạy cgsnapshot -sđể lấy thông tin mà không cần ghi tệp cấu hình theo cách thủ công, không nên dùng tệp cấu hình sau.
Mingliang Liu

Bạn có muốn thực sự điều tiết quá trình, tức là đảm bảo rằng nó không bao giờ vượt quá một khoảng thời gian đã đặt?
Ken Sharp

Tôi đã sử dụng phương pháp này và nó hiệu quả với tôi .. ubuntuforums.org/showthread.php?t=992706
Mustafa Salman

Câu trả lời:


19

Trong trường hợp không có chi tiết được yêu cầu ...

Đây là cách tôi sử dụng các nhóm trên ubfox.

Trong suốt bài đăng này, bạn sẽ cần thay đổi biến "$ USER" thành người dùng đang chạy quy trình

Tôi đã thêm thông tin cho bộ nhớ cũng như đó sẽ là một Câu hỏi thường gặp, nếu bạn không cần thì đừng sử dụng nó.

1) Cài đặt cgroup-bin

sudo apt-get install cgroup-bin

2) Khởi động lại. cgroups hiện được đặt tại/sys/fs/cgroup

3) Tạo một nhóm cho người dùng của bạn (chủ sở hữu của quy trình)

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

4) Người dùng của bạn có thể họ quản lý tài nguyên. Theo mặc định, người dùng nhận được 1024 đơn vị cpu (chia sẻ), do đó, để giới hạn khoảng 10% cpu, bộ nhớ được tính bằng byte ...

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

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

5) Bắt đầu quá trình của bạn (thay đổi exec thành 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> &

Cấu hình

Giả sử các nhóm đang làm việc cho bạn;)

Chỉnh sửa /etc/cgconfig.conf, thêm vào nhóm tùy chỉnh của bạn

# Graphical
gksudo gedit /etc/cgconfig.conf

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

Thêm vào nhóm của bạn. Một lần nữa thay đổi $ USER thành tên người dùng sở hữu quy trình.

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;
    }
}

Bạn cũng có thể chỉ định các nhóm gid=$GROUP, /etc/cgconfig.conf được nhận xét tốt.

Bây giờ một lần nữa chạy quy trình của bạn với cgexec -g cpu:$USER command <options>

Bạn có thể thấy quy trình của mình (bằng PID) trong /sys/fs/cgroup/cpu/$USER/tasks

Thí dụ

Bodhi @ ufbt: ~ $ cgexec -g cpu: bồ đề ngủ 100 &

[1] 1499

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

1499

Để biết thêm thông tin, hãy xem: http://docs.redhat.com/docs/en-US/Red_Hat_ Entryprise_Linux / 6 / html / Resource_Quản lý_Guide /


2
Tôi đã quản lý để hoàn thành phần 1. Nó hoạt động, nhưng bạn nên thêm thông tin rằng quy trình chỉ bị giới hạn trong khi một số quy trình khác cần cpu / bộ nhớ. Điều đó không rõ ràng - và tôi mất nhiều thời gian để tìm hiểu (vì tôi là người bắt đầu). Tôi có hiểu chính xác rằng "Cấu hình" là để lưu cài đặt ngay cả sau khi khởi động lại không?
Rafal

1
Vui mừng bạn đã nhận nó được sắp xếp. Có một chút về đường cong học tập =) Có, cấu hình là để giữ cho các cài đặt trong quá trình khởi động.
Panther

Khi tôi sử dụng cgroup từ dòng lệnh, nó hoạt động tốt. Nhưng khi tôi thực thi cùng một lệnh từ hàm exec trong php: (<? Php exec ("cgexec -g cpu: GroupHere NameOfProcess InputFile OutputFile"); nó không hoạt động. Chỉ khác là từ dòng lệnh tôi sử dụng các tệp trong thư mục Tôi vào và từ php Tôi sử dụng đường dẫn dài đến các tệp đó. Mọi ý tưởng có thể là vấn đề gì không? Tôi sử dụng cùng một người dùng trong cả hai trường hợp.
Rafal

1
@Rafal: Tôi không nhận xét đầu tiên của bạn là chính xác, bộ nhớ nên bị hạn chế ngay cả khi không có quá trình nào khác chiếm nhiều bộ nhớ.
Flimm

1
@Flimm Chỉ có 2 quy trình được chạy khi tôi đang thử nghiệm giải pháp này - apache và quy trình nên được giới hạn. Khi không có kết nối apache nào hoặc chỉ có một kết nối với apache, quy trình giới hạn đó đã chiếm 100% cpu. Nó chỉ bị giới hạn khi một số kết nối đến apache được bật lên (tôi đã làm điều này bằng cách làm mới trang web rất nhiều từ trình duyệt web). Vì vậy, có thể đó là trường hợp không có quá trình khác đang chạy.
Rafal
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.