Làm cách nào để tăng dung lượng trao đổi tối đa trên Mac OS X?


14

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_pagernó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 -Stù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.


Tôi cũng đã đăng câu hỏi này trên apple.stackexchange.com, nhưng không có bất kỳ câu trả lời nào ở đó.
Đánh dấu Adler

1
Lý do mà bạn có thể mallocnhiề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.
ctrl-alt-delor

Tôi không thể hiểu tại sao bạn cho rằng đoạn 5 là đúng, nó không tuân theo đoạn 4 (mặc dù bạn bắt đầu với đoạn này vì vậy nên). Ngoài ra, bạn đã thử thêm nhiều trao đổi? (câu hỏi không rõ ràng về điều này, mặc dù tôi nghi ngờ câu trả lời là có).
ctrl-alt-delor

@richard Vâng, tôi biết tại sao 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.
Đánh dấu Adler

@richard Vì thông báo kernel nói "trao đổi thấp". Đối với "thêm nhiều trao đổi", không tôi đã không làm điều đó bởi vì tôi không biết làm thế nào. Đó chính xác là câu hỏi này. Làm cách nào để thêm không gian hoán đổi? Tất nhiên, kernel tự động thêm không gian hoán đổi, nhưng chỉ đến một giới hạn. Do đó, gốc của câu hỏi: Làm cách nào để tăng giới hạn không gian hoán đổi của kernel?
Đánh dấu Adler

Câu trả lời:


4

Không phải câu trả lời bạn yêu cầu, nhưng nếu bạn tạo tệp của riêng mình với kích thước phù hợp, hãy đưa nó vào quy trình của bạn và sau đó chạy phép tính của bạn trong không gian địa chỉ này, nó sẽ có tác dụng tương tự như tệp hoán đổi và bạn được đảm bảo có không gian, trái ngược với việc cạnh tranh với các quy trình khác để có RAM / trao đổi có sẵn.

Nó cũng có thể chậm hơn, tùy thuộc vào tần suất bạn ghi đè dữ liệu, nhưng sẽ dễ mang theo hơn nhiều.


2
Ý tưởng tuyệt vời! Tôi đã có hy vọng cao. Than ôi, họ đã lao vào bờ biển khắc nghiệt của thực tế. Quá trình này vẫn bị kernel giết chết vì số lượng lớn trao đổi, giống như trước đó (thông báo bảng điều khiển "trao đổi thấp"), mặc dù nó đang sử dụng một tệp mà tôi đã tạo để sử dụng làm bộ nhớ ảo mmap().
Đánh dấu Adler

Xin lỗi, hầu hết kinh nghiệm của tôi là với Linux. Nhưng, có lẽ vấn đề là hạt nhân không quay trở lại tập tin và thay vào đó giữ nó trong RAM. Điều gì nếu bạn định kỳ gọi msync()để buộc nó làm như vậy?
dataless

0

Thông tin mac của tôi khá cũ, có thể không còn phép thuật hạt nhân để làm điều này. Vì vậy, tôi khuyên bạn nên sử dụng Linux cho chương trình này, nơi bạn có thể gắn kết một thư mục hoặc phân vùng dưới dạng trao đổi rất đơn giản.

Loại bỏ sự không chắc chắn của việc sử dụng một thư mục trao đổi động. Tạo phân vùng trao đổi vật lý (chỉ là phân vùng chưa được định dạng trống, với mã loại bảng đĩa để trao đổi, trong Linux, đó là mã hex0x82 .) Sau đó:

  1. Chỉnh sửa tập tin / etc / rc tìm phần bình luận trao đổi tất cả. thêm dòngmount -vat swap
    • có nghĩa là gắn kết tất cả các phân vùng trao đổi trong / etc / fstab
  2. chạy pdisk /dev/disk? -dump
    • "?" là số đĩa của bản ghi hd của bạn, số bên cạnh phân vùng trao đổi
  3. Chỉnh sửa hoặc tạo / etc / fstab (có thể không tồn tại) thêm một dòng như /dev/disk?s?? none swap sw 0 0
    • ? là đĩa của bạn.
    • ?? là số lượng phân vùng trao đổi.
  4. khởi động lại.
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.