Làm cách nào để ngăn bản thân vô tình chỉ định quá nhiều luồng khi biên dịch?


2

Khi tôi biên dịch công cụ, tôi thường muốn thực hiện việc này nhanh chóng, vì vậy trên máy trạm của tôi, tôi gặp sự cố

make -j16

Và (gnu) bắt đầu biên dịch với 16 lõi. Tuy nhiên, khi tôi quay lại máy tính xách tay, tôi không có 16 lõi. Vì vậy, khi tôi phát hành lệnh tương tự, máy của tôi đóng băng đến chết. Tôi không thể chuyển sang thiết bị đầu cuối thay thế thông qua CTRL + ALT + F1, v.v., cũng không đăng nhập từ xa sẽ thành công. CTRL + C, CTRL + 4 không ai trong số họ sẽ được xem xét. (BTW: không có chức năng tự động tắt nào sẽ thành công, ví dụ: tự động hết bộ nhớ) Tôi phải tắt máy sau đó. (Tôi sử dụng Ubuntu 11.10 với kernel 3.0.x)

Một giải pháp là lấy trước số lượng lõi có sẵn trên máy hiện tại với một mục tiêu nhỏ, trong đó mọi mục tiêu "song song" khác phụ thuộc và không sử dụng trực tiếp "make -j $ NUMCORES". (Tôi đã thực hiện điều đó và nhận ra với một chương trình c ++ nhỏ bằng cách sử dụng các luồng tăng cường). Nhưng điều này sẽ không bảo vệ tôi khỏi việc vô tình chỉ định "make -j16" một lần nữa.

Ngoài ra, "quá nhiều" lõi không được có cùng số lõi (bao gồm cả lõi luồng) như có sẵn, vì các luồng +1 hoặc +2 sẽ vẫn không giết chết máy.

Tôi có thể sử dụng ulimits để kiểm duyệt vấn đề? Tôi mặc dù về việc chỉ định đặt không gian hoán đổi thành 0. Sau đó tôi nên có một thay đổi khi hủy bỏ tôi phỏng đoán .


1
Đối với giải pháp đầu tiên, export MAKEFLAGS="-j$(nproc)" có thể được sử dụng; không cần makefiles đặc biệt. Cho lần thứ hai, alias make="nice ionice make" có lẽ?
grawity

Tại sao bạn không đăng bài này như một câu trả lời? Cảm ơn!
math

1
Bởi vì nó không ngăn chặn bạn chạy make -j16, nó chỉ cung cấp cho một cơ hội nhỏ để phục hồi.
grawity

Có bạn đúng;), Tuy nhiên, điều này tốt hơn nhiều so với mục tiêu thực hiện đặc biệt mà tôi đã sử dụng cho đến nay!
math

Câu trả lời:


5

Bạn không cần phải viết bất kỳ Makefiles đặc biệt nào để xác định số lượng lõi; các cờ mặc định có thể được chỉ định trong môi trường và Linux lõi đi kèm với một công cụ gọi là nproc:

export MAKEFLAGS="-j$(nproc)"

Nếu nproc không tồn tại trong hệ thống của bạn, một giải pháp thay thế (cũng chỉ dành cho Linux) là getconf:

export MAKEFLAGS="-j$(getconf _NPROCESSORS_ONLN)"

Bảo vệ một phần chống lại sự đóng băng hoàn toàn có thể được thực hiện bằng cách chạy make (cùng với toàn bộ quá trình xây dựng) ở mức ưu tiên CPU và IO thấp:

alias make="nice ionice make"

Tuy nhiên, lưu ý rằng điều này sẽ làm chậm quá trình biên dịch nếu các tiến trình khác đang sử dụng đĩa IO hoặc CPU nhiều cùng một lúc.


Bạn cũng có thể viết một tập lệnh bao bọc (hoặc một hàm shell) để kiểm tra tất cả các đối số được cung cấp cho nó:

make() {
    local arg
    for arg; do
        [[ $arg == -j* ]] && {
            echo "Rejecting '$arg' in make args. Use 'command make ...' to bypass."
            return 1
        }
    done
    command make "$@"
}
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.