2013-01-09 30 views
5

Đây không phải là lần đầu tiên tôi nhận được cảnh báo tải CPU quá nhiều từ lưu trữ của mình. Mã chỉ là một số tập lệnh php ngẫu nhiên với các truy vấn mysql, không có gì lạ mắt. (Các bảng không có gì đặc biệt, tối đa vài trăm dòng và tôi luôn giới hạn chúng nếu được yêu cầu.Giới hạn tải CPU hoặc quy trình thiết lập độ tuổi

Tôi không bận tâm nếu nó chạy trong 0,15 giây thay vì 0,05, vậy có cách nào tôi có thể kiểm soát ưu tiên quy trình hay không giới hạn cpu tải?

Cảm ơn!

Trả lời

11

Nếu đây là một dameon hoặc chương trình chạy trong thời gian dài thêm sleep()/usleep(). một giấc ngủ nhỏ sẽ làm giảm việc sử dụng CPU của bạn một cách đáng kể.

Tiếp theo mã sẽ tiêu thụ rất nhiều c pu

while(...){ 
//do stuff 
} 

Vì bạn không dành chỗ cho CPU để thực hiện tác vụ khác tại đây. thay đổi nó thành

while(...){ 
    //do stuff 
    sleep(1); 
} 

Điều này sẽ làm giảm đáng kể mức sử dụng CPU của bạn. 1 giây cho CPU là rất nhiều thời gian để thực hiện nhiệm vụ khác.

Để ngủ thêm 0.1 giây thứ hai (0.15 - 0.05) sử dụng usleep().

usleep(100000); 
+0

Cảm ơn bạn rất nhiều, đó là câu trả lời hoàn hảo! – molbal

+0

Về cơ bản, nó sẽ không giảm mức sử dụng, vì nó sẽ vẫn giữ nguyên. Nhưng sẽ quá trình phát triển từ việc tăng tốc đến 100% mức sử dụng CPU cho toàn bộ thời lượng của một tập lệnh. Mà sẽ không chặn các nhiệm vụ khác cần được thực hiện nhanh hơn. – Grzegorz

6

Về nguyên tắc, trên hệ thống Unixish (Linux, BSD, vv), bạn có thể sử dụng proc_nice() chức năng để thay đổi ưu tiên xử lý, như thế này:

proc_nice(20); // now this process has very low priority 

Tuy nhiên, có một cặp vợ chồng trong số các cảnh báo chính ở đây làm cho nó ít hữu ích hơn trong thực tế:

  • Nó không được hỗ trợ trên Windows.
  • Bạn chỉ được phép tăng độ đẹp, chứ không phải để giảm giá trị (không quay lại giá trị ban đầu của nó).
  • Tính độc đáo vẫn tồn tại cho đến khi tiến trình PHP thoát, có thể là một vấn đề nếu bạn đang chạy PHP như là một quy trình FastCGI, hoặc thậm chí tệ hơn, như là một phần mở rộng máy chủ web.
  • Vì các vấn đề trên, proc_nice() có thể bị tắt vì lý do bảo mật ngay cả trên các hệ thống có thể hỗ trợ kỹ thuật.

gì bạn có thể thử để làm, nếu webhost của bạn cho phép nó, là để start a background process cho nhiệm vụ lâu dài, do đó máy chủ web của bạn có thể trở lại phục vụ các yêu cầu trong khi nó đang chạy. Bạn thậm chí có thể sử dụng lệnh nice vỏ để giảm độ ưu tiên của tiến trình nền, như thế này:

exec("nice nohup php -f slow_script.php </dev/null> output.txt 2>&1 &"); 

Một khi kịch bản chậm đã hoàn tất, bạn có thể nhận được kết quả của mình bằng cách tải output.txt.

+0

Cảm ơn bạn đã trả lời tốt bụng! Tôi đánh dấu điều này là hữu ích, nhưng tôi chưa có đủ đại diện :) – molbal

+0

Thực ra, đề xuất đầu tiên của tôi không hữu ích lắm, như tôi đã lưu ý, nhưng tôi đã thêm một gợi ý hữu ích hơn - xem ở trên. :) –

+0

Cảm ơn bạn lần nữa! Tôi không muốn rắc rối với điều này, bởi vì tôi làm việc chủ yếu từ nhà, nơi tôi phải chạy Windows. Mặt khác, tôi đã lưu các đoạn mã này. Tôi không biết PHP có khả năng này, tôi học một cái gì đó mới mỗi ngày :) – molbal

0

Ngoài Ilmari Karonen của câu trả lời:

Nếu bạn muốn tăng hoặc giảm giá trị nice của quá trình hiện tại sử dụng renice cùng với quá trình id hiện tại:

function custom_proc_nice($priority) { 

    exec("renice +$priority ".getmypid()); 

} 

Nếu bạn muốn ngăn chặn sự tính độc đáo để tồn tại sau khi quá trình PHP thoát, bạn sẽ cần một chức năng tắt máy:

function exit_func(){ 

    // Restore priority 
    proc_nice(0); 
} 

register_shutdown_function('exit_func'); 

Reso urces

http://php.net/manual/en/function.proc-nice.php

+0

Than ôi, trừ khi bạn đang chạy PHP như người dùng root (điều này cực kỳ không an toàn, vì vậy bạn thực sự không nên), ['renice' cũng không thể giảm tính độc đáo của một tiến trình.] (http://linux.die.net/man/8/renice) –

+0

Tốt để biết. Cảm ơn thông tin và phản ứng Ilmari! Giá trị mặc định cho một quá trình php được đặt thành 0? – RafaSashi

Các vấn đề liên quan