`Make -j` (không có đối số) có nguy hiểm không? [đóng cửa]


13

Đầu ngày hôm nay khi xây dựng một cái gì đó, tôi quyết định chạy makenhư

$ make -j

có lẽ theo thói quen với các chương trình khác như cabalnơi -jmặc định là một giới hạn hợp lý.

Khoảng 20 giây sau, toàn bộ máy tính để bàn của tôi dừng lại . Tôi tìm kiếm các dấu hiệu hoạt động khác nhau. Không có người hâm mộ quay lên. Đèn HDD có màu xanh lá cây đặc, nhưng tôi không nghe thấy hoạt động của đĩa. Hmmmmm. Sau 10 phút im lặng, cuối cùng tôi cũng thấy một phản hồi cho phím bấm đầu tiên tôi tạo ra từ lâu, và tôi cũng bắt đầu nghe thấy âm thanh quá quen thuộc của tiếng đập đĩa. 20 phút sau khi từ từ cố gắng lội đường vào một thiết bị đầu cuối trên cỗ máy không phản hồi này, tôi đã trích dẫn và sử dụng REISUB.


Lúc đầu, tôi nghĩ rằng một ứng dụng máy tính để bàn không liên quan phải là thủ phạm, bởi vì từ lâu tôi đã đặt giới hạn bộ nhớ vào các phiên bash tương tác để ngăn tôi đặt mình vào tình huống chính xác như vậy! Nhưng /var/log/syslogkể một câu chuyện khác; kẻ giết oom bỏ lại đằng sau một số psbãi được nghi ngờ đóng gói với c++cc1plusquá trình!

Dưới đây là phân tích tần số của một trong những bãi rác đó:

Command          Number of appearances
'sh'                    322
'c++'                   321
'cc1plus'               321
'chrome'                 27
'make'                   27
'bash'                    3
all else combined       120

Vì vậy, tôi kiểm tra trang man cho GNU make: (nhấn mạnh thêm)

-j [jobs], --jobs [= jobs] Chỉ định số lượng công việc (lệnh) để chạy đồng thời. Nếu có nhiều tùy chọn một -j, thì tùy chọn cuối cùng có hiệu lực. Nếu tùy chọn -j được đưa ra mà không có đối số, hãy thực hiện sẽ không giới hạn số lượng công việc có thể chạy đồng thời.


Tôi miễn cưỡng xem liệu tôi có thể tái tạo vấn đề không (Bác sĩ, thật đau khi tôi làm điều này ...) , nhưng kết quả điều tra cho đến nay dường như là một cuộc chạy tại nhà: Rõ ràng, make -jvà hàng trăm quy trình kết quả phải có là nguyên nhân của việc treo và đập đĩa. Điều đó nói rằng, tìm kiếm trên internet, tôi không thể tìm thấy nhiều cảnh báo chống lại nó. Tôi có nhảy vào kết luận không?

make -jnguy hiểm như nó có vẻ với tôi? Nếu vậy, tại sao nó lại ở đó, và có thể làm gì để chứng minh điều đó?


Lưu ý: Ở câu hỏi cuối cùng, tôi đang xem xét thêm một alias make="make -j4"để loại bỏ sự cần thiết phải thêm các -jNđối số, nhưng tôi vẫn chưa nghĩ đến tất cả các hậu quả có thể xảy ra ...
Exp HP

1
Đối với giới hạn toàn cầu, vui lòng sử dụng makecác cơ sở riêng và làm export MAKEFLAGS="-j 4". Để điều tra thêm tôi khuyên bạn nên đọc trước khi . PS: <số lõi> + 2 đã phục vụ tôi tốt trong gần hai thập kỷ nay. Ngày trước, Linus đã làm một trận chung kết make -j128trước khi phát hành kernel.
Bananguin

Câu trả lời:


6

Có những công cụ cho phép bạn tự bắn vào chân mình bằng nhiều cách tưởng tượng. Điều này là để bạn có thể sử dụng trí tưởng tượng của mình để giải quyết vấn đề mà không bị hạn chế bởi những gì người khác cho là "lành mạnh".

Chạy make -jtrên một dự án nhỏ là hoàn toàn hợp lý. Trong các dự án khác, sử dụng -jmà không có đối số sẽ làm tê liệt nghiêm trọng khả năng đáp ứng của hệ thống. Trong một số dự án, sử dụng các bản dựng song song, thậm chí với -j2, sẽ phá vỡ hoàn toàn bản dựng (các tệp được tạo bởi quy trình tạo song song không có thời gian cho một bản khác, v.v.).

Cá nhân tôi sẽ tránh răng cưa makeđể make -j4(như bạn nói bạn đang xem xét, trong ý kiến). Tôi thấy rằng tốt hơn là nói rõ cho máy biết phải làm gì, để tôi biết nó sẽ làm gì. Trong vài ngày, tôi sẽ quên đi bí danh đó và tự hỏi tại sao bốn dự án tôi đang xây dựng trong các thiết bị đầu cuối riêng biệt lại khiến hệ thống của tôi không phản hồi.

Đối với "nguy hiểm" ... Từ này có nghĩa là những thứ khác nhau trong các bối cảnh khác nhau. Có, nó "nguy hiểm" vì nó có thể khiến hệ thống không phản hồi. Đúng, nó "nguy hiểm" vì nó có thể làm hỏng quá trình xây dựng giữa chừng quá trình xây dựng. Nhưng không, nó không "nguy hiểm" theo nghĩa là nó sẽ định dạng lại ổ cứng của bạn hoặc bắt đầu xóa các tệp ngẫu nhiên.

Vì vậy, làm thế nào để chứng minh ngu ngốc?

Dưới đây là hướng dẫn từng bước chắc chắn:

  1. Tìm hiểu để sử dụng các công cụ của bạn.

Cũng lưu ý rằng -jcờ cho BSD make không yêu cầu đối số và cờ này không chuẩn (tiêu chuẩn POSIX Unix không đề cập đến nó).


4

Bạn cũng có thể hạn chế sử dụng -l:

-l [load], - load-Average [= load] Chỉ định rằng không có công việc mới (lệnh) nào được bắt đầu nếu có các công việc khác đang chạy và trung bình tải ít nhất là tải (số dấu phẩy động). Không có đối số, loại bỏ giới hạn tải trước đó.

Nhưng lưu ý rằng nó dường như không giúp chạy nó như thế này : make -j -l4.

Quá nhiều công việc được bắt đầu trước khi trung bình tải tăng vượt quá giới hạn (dựa trên kinh nghiệm của tôi). Do đó, một sự kết hợp có thể làm việc, ví dụ make -j8 -l4.

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.