Tôi nghĩ rằng toàn bộ bản chất của trao đổi là hoạt động như một mạng an toàn lưu trữ tạm thời khi RAM đầy nhưng phân vùng trao đổi của tôi liên tục được sử dụng mặc dù đôi khi tôi có tới 3GB RAM miễn phí. Điều này có bình thường không?
Tôi nghĩ rằng toàn bộ bản chất của trao đổi là hoạt động như một mạng an toàn lưu trữ tạm thời khi RAM đầy nhưng phân vùng trao đổi của tôi liên tục được sử dụng mặc dù đôi khi tôi có tới 3GB RAM miễn phí. Điều này có bình thường không?
Câu trả lời:
Bạn có thể thử thay đổi giá trị "swappiness" của mình:
Từ Câu hỏi thường gặp về hoán đổi của Ubuntu :
Swappiness là gì và làm thế nào để tôi thay đổi nó?
Tham số swappiness kiểm soát xu hướng của kernel để di chuyển các tiến trình ra khỏi bộ nhớ vật lý và vào đĩa trao đổi. Vì các đĩa chậm hơn nhiều so với RAM, điều này có thể dẫn đến thời gian phản hồi chậm hơn cho hệ thống và ứng dụng nếu các quá trình di chuyển quá mạnh ra khỏi bộ nhớ.
swappiness có thể có giá trị từ 0 đến 100
swappiness = 0 nói với kernel để tránh các quá trình hoán đổi ra khỏi bộ nhớ vật lý càng lâu càng tốt. Đối với Kernel phiên bản 3.5 và mới hơn, nó vô hiệu hóa tính hoán đổi.
swappiness = 100 bảo kernel nhân mạnh mẽ trao đổi các tiến trình ra khỏi bộ nhớ vật lý và chuyển chúng sang hoán đổi bộ đệm
Cài đặt mặc định trong Ubuntu là swappiness = 60. Giảm giá trị mặc định của swappiness có thể sẽ cải thiện hiệu suất tổng thể cho cài đặt máy tính để bàn điển hình của Ubuntu. Giá trị của swappiness = 10 được khuyến nghị, nhưng hãy thử nghiệm. Lưu ý: Cài đặt máy chủ Ubuntu có các yêu cầu hiệu suất khác nhau đối với các hệ thống máy tính để bàn và giá trị mặc định là 60 có thể phù hợp hơn.
Để kiểm tra giá trị trao đổi
cat /proc/sys/vm/swappiness
Để thay đổi giá trị swappiness Có thể thực hiện thay đổi tạm thời (mất khi khởi động lại) với giá trị swappiness bằng 10
sudo sysctl vm.swappiness=10
Để thay đổi vĩnh viễn , hãy chỉnh sửa tệp cấu hình bằng trình chỉnh sửa yêu thích của bạn:
gksudo gedit /etc/sysctl.conf
Tìm kiếm vm.swappiness và thay đổi giá trị của nó như mong muốn. Nếu vm.swappiness không tồn tại, hãy thêm nó vào cuối tệp như sau:
vm.swappiness=10
Lưu tập tin và khởi động lại.
Ngoài ra, bạn có thể xem: https://askubfox.com/a/103916/54187
sudo sysctl --load=/etc/sysctl.conf
sau khi chỉnh sửa tệp để áp dụng các thay đổi
Có một vài khía cạnh khác nhau cho câu hỏi của bạn.
Thứ nhất, định nghĩa của bạn về "miễn phí" là gì. Nó thực sự không đơn giản như âm thanh trong Linux (hoặc bất kỳ hệ điều hành hiện đại nào).
Cách Linux sử dụng RAM (rất đơn giản)
Mỗi ứng dụng có thể sử dụng một số bộ nhớ của bạn. Linux sử dụng tất cả các bộ nhớ không có người khác (ngoại trừ vài Mb cuối cùng) làm "bộ đệm". Điều này bao gồm bộ đệm trang, bộ đệm inode, v.v ... Đây là một điều tốt - nó giúp tăng tốc mọi thứ. Cả ghi vào đĩa và đọc từ đĩa đều có thể được tăng tốc bằng bộ đệm.
Lý tưởng nhất là bạn có đủ bộ nhớ cho tất cả các ứng dụng của mình và bạn vẫn còn vài trăm Mb cho bộ nhớ cache. Trong tình huống này, miễn là các ứng dụng của bạn không tăng sử dụng bộ nhớ và hệ thống không phải vật lộn để có đủ dung lượng cho bộ đệm, thì không cần phải trao đổi.
Khi các ứng dụng yêu cầu nhiều RAM hơn, nó chỉ cần đi vào một số không gian được sử dụng bởi bộ đệm, thu nhỏ bộ đệm. Phân bổ bộ nhớ cache rẻ và đủ dễ dàng để thực hiện đơn giản trong thời gian thực - mọi thứ nằm trong bộ đệm chỉ là bản sao thứ hai của một cái gì đó đã có trên đĩa, vì vậy có thể được xử lý ngay lập tức hoặc đó là thứ chúng ta sẽ làm đã phải tuôn vào đĩa trong vòng vài giây tiếp theo nào .
Đây không phải là một tình huống dành riêng cho Linux - tất cả các hệ điều hành hiện đại đều hoạt động theo cách này. Các hệ điều hành khác nhau có thể chỉ báo cáo RAM miễn phí khác nhau: một số bao gồm bộ đệm như một phần của những gì chúng cho là "miễn phí" và một số thì không.
Khi bạn nói về RAM miễn phí, việc bao gồm bộ nhớ cache sẽ có ý nghĩa hơn rất nhiều , vì thực tế nó là miễn phí - bất kỳ ứng dụng nào cũng có thể yêu cầu nó. Trên Linux, free
lệnh báo cáo cả hai cách - dòng đầu tiên bao gồm bộ đệm trong cột RAM đã sử dụng và dòng thứ hai bao gồm bộ đệm (và bộ đệm) trong cột miễn phí.
Cách Linux sử dụng trao đổi (thậm chí đơn giản hơn)
Khi bạn đã sử dụng đủ bộ nhớ mà không còn đủ cho bộ nhớ cache chạy trơn tru, Linux có thể quyết định phân bổ lại một số bộ nhớ ứng dụng không sử dụng từ RAM để trao đổi.
Nó không làm điều này theo một giới hạn nhất định. Không giống như bạn đạt được một tỷ lệ phân bổ nhất định sau đó Linux bắt đầu hoán đổi. Nó có một thuật toán khá "mờ". Phải mất rất nhiều thứ, điều này có thể được mô tả tốt nhất bằng "có bao nhiêu áp lực để phân bổ bộ nhớ". Nếu có nhiều "áp lực" để phân bổ bộ nhớ mới, thì nó sẽ tăng khả năng một số người sẽ bị tráo đổi để tạo thêm chỗ. Nếu có ít "áp lực" hơn thì sẽ giảm những cơ hội này.
Hệ thống của bạn có cài đặt "swappiness" giúp bạn điều chỉnh cách tính "áp lực" này. Thông thường không nên thay đổi điều này và tôi không khuyên bạn nên thay đổi nó. Hoán đổi nói chung là một điều rất tốt - mặc dù có một vài trường hợp cạnh có hại cho hiệu năng, nếu bạn nhìn vào hiệu năng hệ thống tổng thể, đó là một lợi ích ròng cho một loạt các nhiệm vụ. Nếu bạn giảm độ nhanh, bạn sẽ để dung lượng bộ nhớ cache giảm đi một chút so với mức khác, ngay cả khi nó thực sự hữu ích. Liệu đây có phải là một sự đánh đổi đủ tốt cho bất kỳ vấn đề nào bạn gặp phải khi hoán đổi hay không là tùy thuộc vào bạn. Bạn chỉ nên biết những gì bạn đang làm, đó là tất cả.
Có một tình huống nổi tiếng trong đó hoán đổi thực sự gây hại cho hiệu suất cảm nhận trên hệ thống máy tính để bàn và đó là cách các ứng dụng có thể phản ứng lại với đầu vào của người dùng một cách nhanh chóng sau một thời gian dài và xử lý nền nặng trong IO (chẳng hạn như sao lưu qua đêm) chạy. Đây là một sự chậm chạp rất rõ ràng, nhưng không đủ để biện minh cho việc tắt trao đổi tất cả với nhau và rất khó để ngăn chặn trong bất kỳ hệ điều hành nào. Tắt trao đổi và sự chậm chạp ban đầu này sau khi quét sao lưu / vi-rút có thể không xảy ra, nhưng hệ thống có thể chạy chậm hơn một chút trong cả ngày. Đây cũng không phải là một tình huống giới hạn đối với Linux.
Khi chọn những gì sẽ được hoán đổi vào đĩa, hệ thống sẽ cố gắng chọn bộ nhớ không thực sự được sử dụng - đọc hoặc ghi từ đó. Nó có một thuật toán khá đơn giản để tính toán cái này mà chọn tốt hầu hết thời gian.
Nếu bạn có một hệ thống mà bạn có một lượng RAM khổng lồ (tại thời điểm viết, 8GB là một lượng rất lớn cho một bản phân phối Linux điển hình), thì bạn sẽ hiếm khi gặp phải tình huống cần trao đổi. Bạn thậm chí có thể thử tắt trao đổi. Tôi không bao giờ khuyên bạn nên làm điều đó, nhưng chỉ bởi vì bạn không bao giờ biết khi nào nhiều RAM có thể cứu bạn khỏi một số ứng dụng bị sập. Nhưng nếu bạn biết bạn sẽ không cần nó, bạn có thể làm điều đó.
Nhưng làm thế nào có thể trao đổi tăng tốc hệ thống của tôi? Không trao đổi những thứ chậm lại?
Hành động chuyển dữ liệu từ RAM sang trao đổi là một hoạt động chậm, nhưng nó chỉ được thực hiện khi hạt nhân khá chắc chắn rằng lợi ích tổng thể sẽ vượt xa điều này. Ví dụ: nếu bộ nhớ ứng dụng của bạn tăng đến mức bạn gần như không còn bộ nhớ cache và I / O của bạn rất kém hiệu quả vì điều này, bạn thực sự có thể lấy tốc độ ra khỏi hệ thống nhiều hơn bằng cách giải phóng một số bộ nhớ, thậm chí sau chi phí ban đầu của việc hoán đổi dữ liệu để giải phóng nó.
Đây cũng là giải pháp cuối cùng nếu các ứng dụng của bạn thực sự yêu cầu nhiều bộ nhớ hơn thực tế. Trong trường hợp này, việc hoán đổi là cần thiết để ngăn chặn tình trạng hết bộ nhớ, điều này thường dẫn đến việc ứng dụng bị sập hoặc phải bị giết chết.
Trao đổi chỉ liên quan đến những lúc hệ thống của bạn hoạt động kém vì nó xảy ra vào những lúc bạn hết RAM có thể sử dụng, điều này sẽ làm chậm hệ thống của bạn (hoặc làm cho nó không ổn định) ngay cả khi bạn không trao đổi. Vì vậy, để đơn giản hóa mọi thứ, trao đổi xảy ra vì hệ thống của bạn đang bị sa lầy, thay vì cách khác.
Một khi dữ liệu được trao đổi, khi nào nó xuất hiện trở lại?
Truyền dữ liệu ra khỏi trao đổi là (đối với các đĩa cứng truyền thống, ít nhất) cũng tốn thời gian như đưa nó vào đó. Vì vậy, có thể hiểu được, hạt nhân của bạn sẽ miễn cưỡng loại bỏ dữ liệu khỏi trao đổi, đặc biệt là nếu nó không thực sự được sử dụng (tức là đọc từ hoặc ghi vào). Nếu bạn có dữ liệu trong trao đổi và nó không được sử dụng, thì thực sự đó là một thứ tốt khi nó được trao đổi, vì nó để lại nhiều bộ nhớ hơn cho những thứ khác đang được sử dụng, có khả năng tăng tốc hệ thống của bạn.
free -m
.
Đặt giá trị swappiness không hoạt động trong mọi tình huống. Nếu nó làm việc cho bạn, tuyệt vời. Nếu không, tôi đã viết một kịch bản để định kỳ xóa trao đổi bằng cách tắt và bật lại.
Trao đổi khó khăn là một chút rủi ro nếu bạn không cẩn thận. Nếu bạn không có đủ RAM miễn phí để giữ mọi thứ trong RAM cộng với mọi thứ trong trao đổi, cố gắng vô hiệu hóa trao đổi sẽ khiến hệ thống của bạn không phản hồi. Trước tiên, kịch bản của tôi sẽ kiểm tra xem có đủ RAM miễn phí hay không (cần một chút thao tác, vì lượng RAM miễn phí thực tế khác với free
báo cáo là miễn phí), sau đó chỉ chuyển đổi nếu có. Nhưng, nếu bạn hơi thiếu RAM, đừng bắt đầu một quy trình lớn khác trong khi tập lệnh đang chạy. Đây là:
#!/bin/bash
# Make sure that all text is parsed in the same language
export LC_MESSAGES=en_US.UTF-8
export LC_COLLATE=en_US.UTF-8
export LANG=en_US.utf8
export LANGUAGE=en_US:en
export LC_CTYPE=en_US.UTF-8
# Calculate how much memory and swap is free
free_data="$(free)"
mem_data="$(echo "$free_data" | grep 'Mem:')"
free_mem="$(echo "$mem_data" | awk '{print $4}')"
buffers="$(echo "$mem_data" | awk '{print $6}')"
cache="$(echo "$mem_data" | awk '{print $7}')"
total_free=$((free_mem + buffers + cache))
used_swap="$(echo "$free_data" | grep 'Swap:' | awk '{print $3}')"
echo -e "Free memory:\t$total_free kB ($((total_free / 1024)) MB)\nUsed swap:\t$used_swap kB ($((used_swap / 1024)) MB)"
# Do the work
if [[ $used_swap -eq 0 ]]; then
echo "Congratulations! No swap is in use."
elif [[ $used_swap -lt $total_free ]]; then
echo "Freeing swap..."
swapoff -a
swapon -a
else
echo "Not enough free memory. Exiting."
exit 1
fi
Bạn phải chạy tập lệnh này dưới dạng root (ví dụ: với sudo
). Kịch bản này sẽ không khiến hệ thống của bạn không phản hồi; nếu bạn không đủ RAM, nó sẽ từ chối chuyển đổi. Tôi đã sử dụng kịch bản này mà không gặp vấn đề gì trong gần năm năm nay.
Nói chung trao đổi vẫn không được sử dụng trên các hệ thống ngày nay. Theo kinh nghiệm của tôi, các quy trình đang chạy trong một thời gian dài mà không có các hoạt động chuyên sâu được chuyển sang trao đổi bởi linux.
Nó làm cho một vài chương trình bị ảnh hưởng chạy chậm.
Nếu bạn có nhiều ram miễn phí, bạn có thể tắt trao đổi bằng cách chạy lệnh:
swapoff -av
(bạn sẽ cần sudo
quyền cho nó.)
Nếu bạn không thích trao đổi, bạn có thể bật nó lên, sử dụng lệnh đối xứng:
swapon -av
( lại sudo
yêu cầu).
Khi trao đổi đã được sử dụng cho một chương trình, nó có xu hướng duy trì ánh xạ cho vòng đời của chương trình. Nhiều chương trình có mã (và dữ liệu) hiếm khi được sử dụng .. Một khi bộ nhớ bị tráo đổi, không có khả năng bị hoán đổi.
Một cách để buộc các trang này vào bộ nhớ là tắt thiết bị trao đổi. Nếu bạn có hai, bạn có thể tắt một cái, bật lại, sau đó tắt cái thứ hai. Nếu trao đổi là thực sự cần thiết, nó sẽ di chuyển giữa các thiết bị. Bạn chỉ có thể tắt thiết bị trao đổi (hoặc tệp), nhưng nếu bạn thực sự cần trao đổi không gian mạnh mẽ, điều đó có thể xảy ra.
Bên cạnh những thứ bình thường trong bộ nhớ, tempfs sử dụng không gian hoán đổi và sẽ trao đổi như phần còn lại của bộ nhớ. Nếu bạn chạy một cái gì đó đòi hỏi nhiều đĩa tạm thời, nó có thể buộc các trang bị tráo đổi. Các tệp tạm thời đã tạo có thể không còn được sử dụng sau vài phút và là ứng cử viên tốt sẽ được chuyển sang thiết bị trao đổi.
Trong một nhúm bạn có thể sử dụng một tập tin như một thiết bị trao đổi. Điều này rất hữu ích nếu bạn cần thêm không gian trao đổi tạm thời.
Tôi đã chỉnh sửa tập lệnh của Scott Severance để phù hợp với các phiên bản miễn phí mới hơn bao gồm tổng trường bộ nhớ khả dụng.
#!/bin/bash
free_mem="$(free | grep 'Mem:' | awk '{print $7}')"
used_swap="$(free | grep 'Swap:' | awk '{print $3}')"
echo -e "Free memory:\t$free_mem kB ($((free_mem / 1024)) MiB)\nUsed swap:\t$used_swap kB ($((used_swap / 1024)) MiB)"
if [[ $used_swap -eq 0 ]]; then
echo "Congratulations! No swap is in use."
elif [[ $used_swap -lt $free_mem ]]; then
echo "Freeing swap..."
sudo swapoff -a
sudo swapon -a
else
echo "Not enough free memory. Exiting."
exit 1
fi
free -m
,top -b 1