Tạm dừng / tiếp tục quá trình duy nhất đến / từ đĩa


22

Thỉnh thoảng, chúng tôi muốn tạm dừng các quy trình sử dụng nhiều bộ nhớ trên các máy chủ Ubuntu và OS X của chúng tôi để tạm thời giải phóng một số RAM cho các công việc khác. Nếu tất cả những gì chúng tôi lo lắng là việc sử dụng CPU, một đơn giản Ctrl-Zsẽ hoạt động. Tuy nhiên, chúng ta cần có khả năng giải phóng RAM (bằng cách ghi nó vào đĩa) và sau đó khởi động lại quá trình (đĩa -> RAM) hoặc nói cách khác là "ngủ đông" một quy trình. Bất kỳ manh mối về làm thế nào để làm điều này? (Tốt nhất là từ CLI.) Cảm ơn.


7
Tôi cho rằng khi một tiến trình ở trạng thái lơ lửng, bộ nhớ đã sử dụng của nó là một ứng cử viên được hoán đổi sang đĩa, nếu cần và điều này sẽ được thực hiện tự động từ kernel.
enzotib

1
@enzotib - Tôi không biết nếu điều này xảy ra và, theo lý thuyết, điều này nghe có vẻ tốt. Tuy nhiên, tôi mới làm một bài kiểm tra sơ bộ và trong thực tế nó không hoạt động. Bất kỳ quy trình mới nào được sinh ra trong khi 'Người ăn RAM' bị đình chỉ là rất chậm chạp và tôi không phát hiện bất kỳ hoạt động nào của đĩa sẽ xảy ra nếu RAM bị tráo đổi sang đĩa.
Mike Covington

1
@f Frozenwithjoy Tôi có thể xác nhận rằng điều này xảy ra. Những lý do duy nhất tôi có thể nghĩ rằng quy trình bị đình chỉ sẽ không bị hoán đổi là nếu nó yêu cầu bộ nhớ không thể phục hồi (khá hiếm và (chủ yếu) dành cho root) hoặc nếu bộ nhớ mà ánh xạ được chia sẻ với quy trình hoạt động khác .
Gilles 'SO- ngừng trở nên xấu xa'

1
Một thuật ngữ có thể hữu ích ở đây là "checkpointing" (vâng, một dạng động từ xấu xí). Đây thường là một vấn đề khó khăn vì chương trình có thể đang sử dụng một số tài nguyên có thể thay đổi trạng thái trong khi chương trình đang ngủ. Quản lý vấn đề đó từng là một trong những điểm khác biệt giữa Big Iron và những chiếc máy tính nhỏ bé.
dmckee

Câu trả lời:


8

Không có cơ sở chung để ngủ đông một quy trình duy nhất, chỉ có toàn bộ hệ thống.

Tuy nhiên, nếu bạn không quan tâm rằng hình ảnh quá trình sẽ không tồn tại khi khởi động lại, có một công cụ tích hợp để lưu hình ảnh quá trình vào đĩa: hoán đổi. Đảm bảo bạn có đủ dung lượng trao đổi và nếu có áp lực bộ nhớ và quá trình không hoạt động (ví dụ vì nó bị treo), bộ nhớ của nó sẽ bị tráo đổi.

Nếu bạn biết rằng quá trình này có thể không hoạt động trong một thời gian dài và bạn sẽ cần thời gian phản hồi nhanh vào một lúc nào đó, bạn có thể buộc phải giải phóng rất nhiều RAM bằng cách phân bổ nhiều RAM trong một quá trình ngắn hạn, ví dụ

perl -e '$tmp = "a" x 999999999' # allocate about 1GB

Bạn không có bất kỳ sự kiểm soát nào đối với những gì bị tráo đổi, vì vậy các quy trình khác có thể bị tráo đổi. Trên Linux, bạn có thể trao đổi một quy trình trở lại bằng cách truy cập cưỡng bức các trang mà nó ánh xạ. Kịch bản trong câu trả lời này sẽ thực hiện điều đó: tải vào bộ nhớ tất cả các trang được ánh xạ bởi một quy trình (lưu ý rằng điều này bao gồm các tệp đang mở; bạn có thể duyệt qua các vùng dựa trên thông tin bản đồ để tránh hoán đổi dữ liệu mà bạn biết bạn sẽ cần , xem câu trả lời này để biết thêm thông tin).



5

Hãy chắc chắn rằng bạn có nhiều không gian trao đổi. Đảm bảo hệ thống của bạn được đặt để thích hoán đổi các trang không hoạt động ( vm.swappiness = 100 ). Sau đó, nó là đủ để đình chỉ quá trình. Nhân sẽ thích trao đổi các trang không hoạt động.


-1

Trên Mac OS X, bạn có thể thử sử dụng purgelệnh (được cung cấp cùng với Xcode) để giải phóng một số RAM (không hoạt động).

vm_stat
purge
vm_stat

2
purgesẽ không giúp đỡ ở đây. Nó xóa bộ nhớ cache của đĩa, nhưng điều đó sẽ không khiến bộ nhớ của một quá trình bị tráo đổi, và nó sẽ không làm cho quá trình khác có được RAM nhanh hơn.
Gilles 'SO- ngừng trở nên xấu xa'
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.