Trên Mac OS X Yosemite 10.10.5, khi tôi cố gắng chạy một phép tính cần phân bổ và sử dụng bộ nhớ 128 GB (đó là chương trình dòng lệnh được viết bằng C), hạt nhân sẽ giết chết quá trình của tôi với định kiến cực đoan. Mục nhật ký giao diện điều khiển này là một ví dụ về một trường hợp:
25/9/15 7: 08: 40.000 PM kernel [0]: trao đổi thấp: giết pid 6202 (huffgrp)
Tính toán hoạt động tốt và trong một khoảng thời gian hợp lý khi phân bổ và sử dụng bộ nhớ 64 GB. Máy Mac của tôi có 32 GB RAM và dung lượng beaucoup trên ổ cứng. Tôi cũng đã thử điều này trên một máy Mac khác có RAM 8 GB, trong đó phép tính 64 GB cũng chạy tốt, tất nhiên mất nhiều thời gian hơn, nhưng phép tính 128 GB bị hạt nhân giết chết theo cách tương tự.
Nhân tiện, malloc()
không bao giờ trả lại lỗi, bất kể tôi yêu cầu bao nhiêu dung lượng. Nhân sẽ chỉ giết tiến trình một khi quá nhiều bộ nhớ đó thực sự đang được quá trình sử dụng, dẫn đến nhiều sự hoán đổi vào ổ cứng.
Vì vậy, dường như có một giới hạn không gian hoán đổi bí mật ở đâu đó giữa 64 GB và 128 GB.
Câu hỏi của tôi là: làm cách nào để cấu hình lại kernel để cho phép nhiều không gian hoán đổi hơn? Tôi tìm thấy một tập tin tìm kiếm đầy hứa hẹn /System/Library/LaunchDaemons/com.apple.dynamic_pager.plist
, nhưng tôi không thấy số bí mật trong đó. Trang hướng dẫn dynamic_pager
nói rằng tất cả những gì nó làm là đặt tên và vị trí của các tệp hoán đổi. Có một phiên bản cũ hơn của cùng một trang man ghi lại -S
tùy chọn để đặt kích thước của các tệp hoán đổi được tạo. Tôi đã thử điều đó, yêu cầu trao đổi 160 GB, nhưng nó không có hiệu lực. Các tệp hoán đổi vẫn là 1 GB mỗi tệp và quá trình này vẫn bị giết bởi kernel.
malloc
nhiều hơn bạn có là vì commit_limit rất cao (có thể là vô hạn). Do đó, HĐH sẽ phân bổ bộ nhớ mà nó không có (đây là cá cược rằng quá trình sẽ không sử dụng nó, hệ điều hành thường thắng cược này). Bạn có thể muốn điều chỉnh giới hạn cam kết thành giới hạn bộ nhớ, theo cách này, quá trình sẽ thất bại sớm.
malloc()
lại như vậy. Tôi đã làm chệch hướng những nhận xét có thể về ai đó nghĩ rằng tôi không kiểm tra giá trị trả về của malloc()
. Nhân tiện, mục tiêu của tôi là không thất bại sớm hơn. Mục tiêu của tôi là thành công.