2010-09-05 24 views
9

Tôi đang cố gắng kiểm tra một điều kiện cụ thể sẽ chỉ xảy ra nếu perl có số malloc không thành công do không còn bộ nhớ. Tôi muốn perl chết nhanh nhất có thể. Tôi đã tìm cách ăn chay sẽ được tạo ra một số mảng lớn nhưCách tốt nhất để buộc Perl 5 hết bộ nhớ một cách nhanh chóng trên OS X là gì?

perl -le '$_->[100_000_000_000] = 1 for \(@a, @b, @c, @d); <>'

Nhưng tôi phải giết nó sau khi trao đổi của tôi trúng 5 buổi biểu diễn không có dấu hiệu dừng lại (Tôi đang trên OS X 10.6).

tôi chỉ thử nghiệm nó trên Linux và nó chết khá nhanh:

time perl -le '$_->[1_000_000_000] = 1 for \(@a, @b, @c, @d); <>' 
Out of memory! 

real 0m0.023s 
user 0m0.012s 
sys  0m0.008s 

Vì vậy, vấn đề có vẻ là OS X và dynamic_pager của nó.

Tôi chỉ cố gắng vô hiệu hóa dynamic_pager với

sudo launchctl unload -w /System/Library/LaunchDaemons/com.apple.dynamic_pager.plist 

và khởi động lại, nhưng máy chỉ bị treo hoàn toàn. Nỗ lực tiếp theo của tôi là thay đổi tệp cấu hình com.apple.dynamic_pager.plist để ghi tệp vm vào một phân vùng rất nhỏ.

+1

Lạ lùng là bạn không có '" x "x 9e9'. – tsee

+0

@tsee Phải mất thời gian để xây dựng chuỗi, nhưng 'perl -e '@a [9e8] = 1'' chỉ là một' malloc'. –

+0

"Tôi đã phải giết nó sau khi trao đổi của tôi đạt 5 gig mà không có dấu hiệu dừng lại (Tôi đang ở OS X 10.6)." - Mac OS X cho thấy loại hành vi đó thường xuyên, bao gồm các trường hợp như 'malloc (-1)'. Hãy thử bất kỳ hệ điều hành nào khác mà bạn có thể vô hiệu hóa việc hoán đổi một cách rõ ràng. (Không bao giờ thử làm điều đó trên máy Mac của tôi - nhưng thực hiện điều đó một cách ngẫu nhiên trên Linux.) – Dummy00001

Trả lời

5

Trong câu hỏi trước "How to simulate memory allocation errors", người dùng freespace đề xuất sử dụng ulimit bằng tài khoản người dùng thử để giới hạn số lượng bộ nhớ có thể được sử dụng. Điều này có thể làm những gì bạn muốn mà không cần phải phân bổ một lượng lớn bộ nhớ.

+0

Điều đó dường như không hoạt động trên OS X. Tôi đã thử 'ulimit -m 64; perl -e '$ s = "x" x (1024 * 1024 * 100); <> ''và kiểm tra sử dụng bộ nhớ và chương trình perl sở hữu hai trăm megabyte. –

+1

IIRC phải là 'ulimit -d', không phải' -m'. – Dummy00001

Các vấn đề liên quan