Làm cho Linux đọc trao đổi trở lại vào bộ nhớ


28

Nhân Linux hoán đổi hầu hết các trang khỏi bộ nhớ khi tôi chạy một ứng dụng sử dụng hầu hết 16GB bộ nhớ vật lý. Sau khi ứng dụng kết thúc, mọi hành động (gõ lệnh, chuyển đổi không gian làm việc, mở một trang web mới, v.v.) sẽ mất rất nhiều thời gian để hoàn thành vì trước tiên các trang liên quan cần phải được đọc lại từ trao đổi.

Có cách nào để bảo nhân Linux sao chép các trang từ hoán đổi trở lại vào bộ nhớ vật lý mà không cần chạm thủ công (và chờ) mỗi ứng dụng không? Tôi chạy rất nhiều ứng dụng nên sự chờ đợi luôn đau đớn.

Tôi thường sử dụng swapoff -a && swapon -ađể làm cho hệ thống phản hồi lại, nhưng điều này sẽ xóa các trang khỏi trao đổi, vì vậy chúng cần được viết lại vào lần tới khi tôi chạy tập lệnh.

Có một giao diện kernel, có lẽ sử dụng sysfs, để hướng dẫn kernel đọc tất cả các trang từ trao đổi?

Chỉnh sửa: Tôi thực sự đang tìm cách để làm cho tất cả các trao đổi hoán đổi. (Cảm ơn derobert!)

[PS serverfault.com/questions/153946/ Và và serverfault.com/questions/100448/ Đây là những chủ đề liên quan nhưng không giải quyết câu hỏi làm thế nào để lấy nhân Linux để sao chép các trang từ hoán đổi trở lại vào bộ nhớ mà không xóa trao đổi.]


Bạn muốn tất cả các trao đổi là một bộ nhớ cache của bộ nhớ hệ thống? Vì vậy, bạn muốn một hình ảnh của bộ nhớ của hệ thống mà bạn có thể tải lại theo ý muốn? Về cơ bản, đây là cách thức ngủ đông hoạt động - hệ thống hình ảnh bộ nhớ của nó vào đĩa, tắt nguồn và khôi phục hình ảnh khi bật nguồn. Bạn có nghĩ rằng, tại một truy vấn theo chủ đề đó có thể hữu ích cho bạn không? Ví dụ: nếu bạn định hình ảnh bộ nhớ của mình, vô hiệu hóa trao đổi, hoàn thành một nhiệm vụ, sau đó khôi phục lại hình ảnh và lặp lại - đó có phải là điều bạn có thể muốn làm không?
mikeerv

Tôi không nghĩ rằng điều này sẽ để trao đổi trong trạng thái hoán đổi. Như vậy đối với tôi, đề xuất của bạn là một phương án thay thế cho phương pháp hoán đổi-trao đổi.
drrossum

Không, nó không lưu trữ bộ đệm trao đổi (mà, phải thừa nhận là hơi lạ đối với tôi) nó lưu trữ RAM tại một số điểm mà bạn cho là không thể tách rời, sau đó dành toàn bộ bộ nhớ hệ thống cho một số tác vụ chuyên sâu trước khi khôi phục bộ đệm khi nhiệm vụ là thông qua. Nếu việc hoán đổi trong nhiệm vụ chuyên sâu là điều bạn muốn thì bạn sẽ chỉ làm chậm nhiệm vụ nói - bạn sẽ cần thêm thời gian để trao đổi các trang khi bạn thực hiện.
mikeerv

Câu trả lời:


4

Dựa trên chương trình memdump ban đầu được tìm thấy ở đây, tôi đã tạo một tập lệnh để đọc có chọn lọc các ứng dụng được chỉ định trở lại bộ nhớ. remember:

#!/bin/bash
declare -A Q
for i in "$@"; do
    E=$(readlink /proc/$i/exe);
    if [ -z "$E" ]; then.
        #echo skipped $i;.
        continue;.
    fi
    if echo $E | grep -qF memdump; then.
        #echo skipped $i >&2;.
        continue;.
    fi
    if [ -n "${Q[${E}]}" ]; then.
        #echo already $i >&2;.
        continue;.
    fi
    echo "$i $E" >&2
    memdump $i 2> /dev/null
    Q[$E]=$i
done | pv -c -i 2 > /dev/null

Cách sử dụng: một cái gì đó như

# ./remember $(< /mnt/cgroup/tasks )
1 /sbin/init
882 /bin/bash
1301 /usr/bin/hexchat
...
2.21GiB 0:00:02 [ 1.1GiB/s] [  <=>     ]
...
6838 /sbin/agetty
11.6GiB 0:00:10 [1.16GiB/s] [      <=> ]
...
23.7GiB 0:00:38 [ 637MiB/s] [   <=>    ]
# 

Nó nhanh chóng bỏ qua bộ nhớ không tráo đổi (gigabyte mỗi giây) và chậm lại khi cần trao đổi.


Công cụ này thực hiện chính xác những gì tôi đang tìm kiếm. Cảm ơn!
drrossum

Một điều tuyệt vời là, từ quan sát của tôi, các trang bị tráo đổi được sao chép trong RAM, nhưng chúng không bị xóa khỏi trao đổi (ít nhất, hầu hết trong số chúng là không, vì việc sử dụng trao đổi chỉ giảm nhẹ). Giải thích của tôi là Linux giữ hai bản sao của mỗi trang, một trong RAM và một trong trao đổi. Nếu điều này được xử lý chính xác, thậm chí còn tốt hơn là hủy và thêm hoán đổi một lần nữa, bởi vì điều đó có nghĩa là, khi một trang kép sẽ phải hoán đổi một lần nữa, sẽ không cần phải sao chép nữa. Nhờ bất kỳ chuyên gia hạt nhân có thể xác nhận.
Giovanni Mascellani

11

Nó có thể giúp tăng /proc/sys/vm/page-cluster(mặc định: 3).

Từ tài liệu kernel (sysctl/vm.txt ):

cụm trang

cụm trang kiểm soát số lượng trang mà các trang liên tiếp được đọc từ trao đổi trong một lần thử. Đây là đối tác trao đổi để đọc bộ nhớ cache trang. Liên tiếp được đề cập không phải là về địa chỉ ảo / vật lý, mà liên tiếp trên không gian hoán đổi - điều đó có nghĩa là chúng được hoán đổi với nhau.

Đó là một giá trị logarit - đặt nó thành 0 có nghĩa là "1 trang", đặt nó thành 1 có nghĩa là "2 trang", đặt nó thành 2 có nghĩa là "4 trang", v.v ... Không vô hiệu hóa hoàn toàn trao đổi đọc.

Giá trị mặc định là ba (tám trang cùng một lúc). Có thể có một số lợi ích nhỏ trong việc điều chỉnh giá trị này thành một giá trị khác nếu khối lượng công việc của bạn là trao đổi nhiều.

Giá trị thấp hơn có nghĩa là độ trễ thấp hơn cho các lỗi ban đầu, nhưng đồng thời các lỗi thêm và độ trễ I / O cho các lỗi sau nếu chúng là một phần của các trang liên tiếp mà readahead sẽ đưa vào.

Tài liệu này không đề cập đến một giới hạn, vì vậy có thể bạn có thể đặt mức cao vô lý này để khiến tất cả các trao đổi được đọc lại thực sự sớm. Và tất nhiên sau đó biến nó trở lại một giá trị lành mạnh.


Điều này nghe có vẻ như một cách giải quyết hữu ích. Hai can thiệp thủ công có thể được kết hợp với lệnh ngủ để biến nó thành một can thiệp của người dùng. Nhưng, nó có thể không nhất thiết làm cho tất cả các trao đổi hoán đổi rất nhanh vì nó chỉ đọc liên tiếp từ trang được truy cập. Đó là giải pháp tốt nhất cho đến nay, mặc dù. Cảm ơn!
drrossum

Đây có lẽ là giải pháp tốt nhất bạn sẽ nhận được. Tôi chưa từng nghe về nó trước đây nhưng có vẻ như nó biến việc hoán đổi thành một loạt các IOP lớn thay vì một bộ IOP nhỏ liên tục có lẽ là nguyên nhân gây ra vấn đề về hiệu suất của bạn. Tôi sẽ ngạc nhiên về mặt pháp lý nếu có điều gì đó giải quyết hoàn hảo tình huống cá nhân của bạn.
Bratchley

Đối với vấn đề đó, nếu bạn gặp phải sự chậm chạp do nhiều lần hoán đổi nhỏ liên tiếp, thậm chí chỉ cần điều chỉnh vĩnh viễn page-clustergiá trị lên có thể cải thiện hiệu suất.
Ilmari Karonen

5

Bạn có thể thử thêm các chương trình mà bạn quan tâm nhất vào một nhóm và điều chỉnh swappiness để lần sau ứng dụng chạy các chương trình bạn thêm sẽ ít có khả năng trở thành ứng cử viên cho việc hoán đổi.

Một số trang của họ có thể vẫn bị tráo đổi nhưng nó có thể xoay quanh các vấn đề về hiệu suất của bạn. Một phần lớn của nó có lẽ chỉ là hành vi "dừng và bắt đầu" khi rất nhiều trang của chương trình bị hoán đổi và chương trình phải liên tục tạm dừng để hoán đổi các trang của nó thành RAM nhưng chỉ tăng 4k.

Ngoài ra, bạn có thể thêm ứng dụng đang chạy vào một nhóm và điều chỉnh swappiness để ứng dụng là ứng dụng có xu hướng sử dụng tệp hoán đổi nhiều nhất. Nó sẽ làm chậm ứng dụng nhưng nó sẽ dành phần còn lại của hệ thống.


4

Dường như với tôi rằng bạn không thể kỳ diệu "làm cho hệ thống phản hồi lại". Bạn có thể phải chịu hình phạt hoặc đọc lại các trang từ không gian hoán đổi vào bộ nhớ hoặc bạn phải chịu nó sau đó, nhưng bằng cách này hay cách khác bạn phải chịu nó. Thật vậy, nếu bạn làm điều gì đó như swapoff -a && swapon -asau đó bạn có thể cảm thấy nhiều đau đớn hơn là ít hơn, bởi vì bạn buộc một số trang được sao chép lại vào bộ nhớ rằng nếu không sẽ chưa bao giờ được cần thiết nữa và cuối cùng rơi mà không bị đọc (suy nghĩ: bạn bỏ một ứng dụng khi phần lớn đống của nó bị tráo đổi, những trang đó có thể bị loại bỏ hoàn toàn mà không bao giờ được đọc lại vào bộ nhớ).

nhưng điều này xóa các trang khỏi trao đổi, vì vậy chúng cần được viết lại vào lần tới khi tôi chạy tập lệnh.

Chà, gần như bất kỳ trang nào được sao chép lại từ hoán đổi vào bộ nhớ chính sắp sửa được sửa đổi, vì vậy nếu nó cần được chuyển trở lại để hoán đổi một lần nữa trong tương lai, dù sao nó cũng sẽ phải được viết lại trong trao đổi. Hãy nhớ rằng trao đổi chủ yếu là bộ nhớ heap, không phải các trang chỉ đọc (thường được hỗ trợ tập tin).

Tôi nghĩ rằng swapoff -a && swapon -amánh khóe của bạn tốt như bất cứ điều gì bạn có thể nghĩ ra.


Đó là hai chúng tôi nói chính xác cùng một điều cùng một lúc;)
goldilocks

@goldilocks yeah, tôi đã thấy câu trả lời của bạn xuất hiện trước khi tôi sẵn sàng nhưng tôi đã xong rồi nên tôi mắc kẹt với nó :-)
Celada

bạn và goldilocks nói điều tương tự nhưng tôi không tin đây là cách hoạt động của bộ đệm ẩn. Hiểu biết của tôi là bạn có thể có các trang trao đổi VÀ bộ nhớ cùng một lúc. Trang trao đổi chỉ bị vô hiệu khi trang trong bộ nhớ được cập nhật.
drrossum

Tôi tin tưởng rằng câu trả lời mà David Spillett đề cập là chính xác: bạn thực sự có thể có một trang trong trao đổi và RAM cùng một lúc ... nhưng chỉ cho đến khi phiên bản RAM được sửa đổi. Sau đó, bạn phải loại bỏ các bản sao lỗi thời trong trao đổi. Khi tôi nói "gần như bất kỳ trang nào được sao chép lại từ hoán đổi [...] sắp sửa được sửa đổi" điều tôi muốn nói là tôi hy vọng rằng đây là điều xảy ra hầu hết thời gian, vì vậy tôi không mong đợi các trang ở cả hai nơi là một phần đáng kể đáng lo ngại.
Celada

Kịch bản sử dụng của bạn có thể khác: bạn có thể có rất nhiều ứng dụng với số lượng lớn thường xuyên được đọc và không được viết. Cảm giác của tôi là hầu hết mọi người không có kịch bản như vậy. Nhưng nếu bạn làm thế, tôi đoán bạn đúng: swapoff -a && swapon -asẽ không tốt cho bạn. Tôi đoán trong trường hợp đó bạn cần thứ gì đó quét /proc/<each-process>/memvà đọc từng trang bộ nhớ để đảm bảo nó tồn tại trong RAM. Không biết nếu điều đó tồn tại.
Celada

0

Có một cuộc thảo luận rất hay ở đây http://rudd-o.com/en/linux-and-free-software/tales-from-responsivelyland-why-linux-feels-slow-and-how-to-fix-that làm giảm khả năng trao đổi, với ý tưởng rằng để tăng khả năng phản hồi của hệ thống, người ta nên ngăn chặn việc trao đổi mã (và đây là điều xảy ra). Đây thực sự không phải là một câu trả lời cho câu hỏi của bạn, nhưng điều này có thể ngăn sự cố xuất hiện (các ứng dụng của bạn không bị tráo đổi, chỉ có dữ liệu không được sử dụng và bộ đệm trang)


Trong khi về mặt lý thuyết có thể trả lời câu hỏi, tốt hơn là nên bao gồm các phần thiết yếu của câu trả lời ở đây và cung cấp liên kết để tham khảo.
slm
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.