Đầu ngày hôm nay khi xây dựng một cái gì đó, tôi quyết định chạy make
như
$ make -j
có lẽ theo thói quen với các chương trình khác như cabal
nơi -j
mặ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/syslog
kể một câu chuyện khác; kẻ giết oom bỏ lại đằng sau một số ps
bãi được nghi ngờ đóng gói với c++
và cc1plus
quá 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 -j
và 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?
Là make -j
nguy 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 đó?
make
cá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 gõ . 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 -j128
trước khi phát hành kernel.
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 ...