Câu hỏi Tại sao swap được sử dụng mặc dù tôi có nhiều RAM miễn phí?


Tôi nghĩ 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 3 GB RAM miễn phí. Điều này có bình thường không?


183
2018-06-29 22:16


gốc


Vui lòng chia sẻ nội dung hoặc đầu ra của các lệnh / tệp sau để giúp chúng tôi khắc phục sự cố của bạn tốt hơn (hướng dẫn trong câu trả lời này): free -m, top -b 1 - ish
Sẽ cập nhật các câu hỏi với pastebins của những lệnh ngày mai. Bây giờ là 12 giờ sáng: ( - Mysterio
Tôi nên chỉnh sửa tiêu đề để thêm "... nhưng tôi quá buồn ngủ để quan tâm ngay bây giờ, vì vậy các bạn cũng ngủ một giấc": P - ish


Các 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ề Swap của Ubuntu:

Sự thay đổi là gì và làm cách nào để thay đổi nó?

Tham số swappiness kiểm soát xu hướng của hạt nhân để di chuyển các tiến trình ra khỏi bộ nhớ vật lý và vào đĩa trao đổi. Bởi vì đĩ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 đối với hệ thống và ứng dụng nếu các quá trình được chuyển quá mạnh khỏi bộ nhớ.

  1. swappiness có thể có giá trị từ 0 đến 100

  2. swappiness = 0 báo cho hạt nhân tránh các quá trình hoán đổi từ bộ nhớ vật lý càng lâu càng tốt

  3. swappiness = 100 báo cho hạt nhân chuyển đổi mạnh mẽ các tiến trình ra khỏi bộ nhớ vật lý và chuyển chúng sang bộ nhớ đệm trao đổi

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 một cài đặt máy tính để bàn Ubuntu điển hình. Một giá trị của swappiness = 10 được khuyến khích, nhưng cảm thấy tự do để thử nghiệm. Lưu ý: Các cài đặt máy chủ Ubuntu có các yêu cầu hiệu năng 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ó khả năng phù hợp hơn.

Để kiểm tra giá trị swappiness

cat /proc/sys/vm/swappiness

Để thay đổi giá trị swappiness Thay đổi tạm thời (bị mất khi khởi động lại) với giá trị swappiness là 10 có thể được thực hiện với

sudo sysctl vm.swappiness=10

Để thực hiện thay đổi vĩnh viễn, chỉnh sửa tệp cấu hình với 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 và khởi động lại.

Ngoài ra bạn có thể kiểm tra: https://askubuntu.com/a/103916/54187


161
2018-06-29 23:10



Nhược điểm đầu cơ: điều này thực sự có lợi cho hiệu suất - các trang không được truy cập trong một thời gian có thể được sao chép sang không gian hoán đổi, cho phép hệ điều hành loại bỏ chúng nhanh chóng nếu cần bộ nhớ, nhưng nội dung trang vẫn còn trong bộ nhớ . - Simon Richter
@ SimonRichter Vâng đó là ý tưởng. Swappiness của 60 có lẽ là quá agressive trên hệ thống hiện đại, mặc dù, kể từ đó có nghĩa là bạn đang bắt đầu trao đổi ra khi bạn vẫn còn có một vài hợp đồng biểu diễn của bộ nhớ miễn phí. - Brendan Long
Chạy sudo sysctl --load=/etc/sysctl.conf sau khi chỉnh sửa tệp để áp dụng các thay đổi - deFreitas


Có một vài khía cạnh khác nhau đối với 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ác (ngoại trừ vài Mb cuối cùng) là "cache". Điều này bao gồm bộ nhớ cache trang, bộ nhớ đệm inode, vv Đây là một điều tốt - nó giúp tăng tốc độ mọi thứ lên đống. Cả hai văn bản vào đĩa và đọc từ đĩa có thể được tăng tốc rất nhiều bởi bộ nhớ cache.

Lý tưởng nhất, bạn có đủ bộ nhớ cho tất cả các ứng dụng của bạn, 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 làm tăng mức sử dụng bộ nhớ của chúng và hệ thống không gặp khó khăn để có đủ không gian cho bộ nhớ cache, không cần phải trao đổi.

Một khi các ứng dụng yêu cầu nhiều RAM hơn, nó đơn giản đi vào một số không gian đã được cache sử dụng, thu hẹp bộ nhớ cache. Bộ nhớ cache phân bổ rẻ và dễ dàng, nó chỉ đơn giản được thực hiện trong thời gian thực - mọi thứ nằm trong bộ nhớ cache chỉ là bản sao thứ hai của thứ gì đó đã có trên đĩa, vì vậy có thể được giải quyết ngay lập tức hoặc đã phải tuôn ra đĩa trong vài giây tới dù sao.

Đây không phải là một tình huống cụ thể đối với 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í một cách khác nhau: một số bao gồm bộ nhớ cache như là một phần của những gì họ coi là "miễn phí" và một số có thể không.

Khi bạn nói về RAM miễn phí, điều đó có ý nghĩa hơn nhiều đối với bao gồm bộ nhớ cache, bởi vì nó thực tế là miễn phí - nó có sẵn nên bất kỳ ứng dụng yêu cầu nó. Trên Linux, free lệnh báo cáo nó cả hai cách - dòng đầu tiên bao gồm bộ nhớ cache trong cột RAM được sử dụng, và dòng thứ hai bao gồm bộ nhớ đệ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)

Một khi bạn đã sử dụng hết bộ nhớ mà không còn đủ cho một bộ nhớ cache chạy mượt mà, 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 đoạn giới hạn xác định. Nó không giống như bạn đạt đến một tỷ lệ phần trăm nhất định của phân bổ sau đó Linux bắt đầu trao đổi. Nó có một thuật toán khá "mờ". Phải mất rất nhiều điều vào tài khoản, mà tốt nhất có thể được mô tả bởi "bao nhiêu áp lực là có cho phân bổ bộ nhớ". Nếu có rất nhiều "áp lực" để cấp phát bộ nhớ mới, thì nó sẽ tăng cơ hội một số sẽ được đổi chỗ để tạo thêm chỗ. Nếu có ít "áp lực" thì nó sẽ làm 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 tinh chỉnh cách "áp suất" này được tính toán. Nó thường không được khuyến khích để thay đổi điều này ở tất cả, và tôi sẽ không khuyên bạn thay đổi nó. Trao đổ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 mà nó gây hại hiệu suất, nếu bạn nhìn vào hiệu suất 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 bớt sự thay đổi, bạn để lượng bộ nhớ cache co lại nhiều hơn một chút so với khi nó có thể thực sự hữu ích. Cho dù đây là một thỏa thuận đủ tốt cho bất kỳ vấn đề bạn đang gặp phải với việc trao đổi 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 đến hiệu suất cảm nhận trên hệ thống máy tính, và đó là cách ứng dụng nhanh chóng có thể phản hồi lại đầu vào của người dùng sau khi không sử dụng trong một thời gian dài và có quá trình 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 hoán đổi tất cả lại với nhau và rất khó để ngăn chặn trong bất kỳ hệ điều hành nào. Tắt hoán đổ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 suốt cả ngày. Đây không phải là một tình huống hạn chế với Linux.

Khi chọn những gì được trao đổi với đĩ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 điều này mà chọn 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 số tiền khổng lồ cho bản phân phối Linux điển hình), thì bạn sẽ rất 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 hoán đổi. Tôi không bao giờ khuyên bạn nên làm điều đó, nhưng chỉ vì bạn không bao giờ biết khi nào RAM nhiều hơn có thể giúp bạn tiết kiệm từ một số ứng dụng bị rơi. Nhưng nếu bạn biết bạn sẽ không cần nó, bạn có thể làm đi.

Nhưng làm thế nào có thể trao đổi tốc độ lên hệ thống của tôi? Không trao đổi những thứ chậm lại?

Các 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 là khá chắc chắn lợi ích tổng thể sẽ lớn hơn này. Ví dụ, nếu bộ nhớ ứng dụng của bạn đã tăng lên đến mức bạn hầu như không có bộ nhớ cache còn lại 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ể nhận được nhiều tốc độ hơn trong hệ thống của mình bằng cách giải phóng bộ nhớ sau khi chi phí ban đầu của trao đổi dữ liệu để giải phóng nó.

Đây cũng là phương sách cuối cùng nếu ứng dụng của bạn thực sự yêu cầu hơn bộ nhớ hơn bạn thực sự có. Trong trường hợp này, hoán đổi là cần thiết để ngăn chặn tình trạng thiếu bộ nhớ mà thường dẫn đến một ứng dụng bị lỗi hoặc phải bị buộc phải giết.

Hoán đổi chỉ liên kết với thời gian mà hệ thống của bạn hoạt động kém bởi vì nó xảy ra vào những thời điểm bạn đang hết RAM, điều này sẽ làm chậm hệ thống của bạn xuống (hoặc làm cho hệ thống không ổn định) ngay cả khi bạn không có trao đổi. Vì vậy, để đơn giản hóa mọi thứ, trao đổi xảy ra bởi vì hệ thống của bạn đang bị sa lầy, thay vì theo cách khác.

Khi dữ liệu được hoán đổi, khi nào nó lại xuất hiện?

Chuyển dữ liệu ra khỏi trao đổi là (đối với đĩa cứng truyền thống, ít nhất) cũng tốn nhiều thời gian như đặt nó vào đó. Vì vậy, dễ hiểu, hạt nhân của bạn sẽ chỉ là miễn cưỡng để loại bỏ dữ liệu từ 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, sau đó nó thực sự là một điều tốt mà nó vẫn còn trong trao đổi, vì nó để lại nhiều bộ nhớ cho những thứ khác mà  đang được sử dụng, có khả năng tăng tốc hệ thống của bạn.


83
2017-07-04 03:50



1 để được giải thích chi tiết. Tôi cũng muốn giữ 2GiB hoán đổi trên máy tính của tôi. Nếu có điều gì đó xấu - rò rỉ bộ nhớ, v.v., bạn có thể thấy sự hoán đổi tăng lên và tìm kiếm sự cố trước khi hết bộ nhớ. Đó là một mạng lưới an toàn cũng như một công cụ hiệu suất. - Joe
Trên netbook của tôi, chỉ có 2GB RAM, tôi vẫn giữ được 4GB. Điều này là do tôi sử dụng netbook cho nhiều thứ mà nó đã được dự định và các chương trình của tôi thường yêu cầu nhiều hơn 2GB bộ nhớ. Vì Linux hoạt động rất kém trong các tình huống ngoài bộ nhớ, tôi thích có một mạng lưới an toàn lớn hơn. Và tôi có nhiều không gian đĩa. - Scott Severance
Nếu các chương trình của bạn thường xuyên yêu cầu bộ nhớ hơn 2GB, tôi sẽ xem xét thêm nhiều RAM trong đó (vì nó cực rẻ!) Vì RAM quá mức sẽ làm giảm hiệu năng. Vì lợi ích của những người đọc khác: hãy làm cho bạn không chỉ nhìn vào bộ nhớ cache được cho là để có sẵn RAM - xem các tham chiếu khác free -m. - thomasrutter
@neon_overload: Tôi chỉ cần lưu ý rằng theo HP, RAM tối đa của netbook của tôi là 1GB. Hiện tại tôi có 2GB và các nguồn internet cho rằng 2GB là mức tối đa thực tế. Vì vậy, sự cần thiết cho các loại cách giải quyết. - Scott Severance
@thomasrutter: Câu trả lời của bạn thay đổi như thế nào đối với các máy chủ lớn, một trong số các máy chủ của tôi có 1TB (có một terabyte đầy đủ) của ram và vẫn đang sử dụng swap; những gì swappiness thiết lập và những gì kích thước phân vùng trao đổi, bạn sẽ khuyên bạn nên? - chrisinmtown


Đặ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 bỏ trao đổi bằng cách tắt nó đi và bật lại.

Toggling trao đổi là một chút nguy hiểm 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 thêm mọi thứ trong trao đổi, cố gắng vô hiệu hóa trao đổi sẽ làm cho hệ thống của bạn trở nên không phản hồi. Kịch bản của tôi đầu tiên kiểm tra xem có đủ RAM miễn phí (mà phải mất một chút làm, vì số lượng RAM thực tế miễn phí khác với những gì free báo cáo miễn phí), sau đó chỉ chuyển đổi sang Toggles nếu có. Tuy nhiên, nếu bạn hơi thiếu RAM, đừng bắt đầu quá trình lớn khác trong khi kịch bản đ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 gốc (ví dụ: với sudo). Tập lệnh 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 có đủ RAM, nó sẽ từ chối chuyển đổi hoá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.


21
2017-07-04 02:38



+1 cho tập lệnh. Bạn có thể muốn hiện đại hóa nó một chút bằng cách thay đổi MB thành MiB trong các kết quả đầu ra. Tôi đã viết một kịch bản tương tự mà không có tất cả các bài kiểm tra an toàn (tốt) mà bạn đưa vào. Trên máy tính xách tay cũ của tôi, nơi trao đổi được sử dụng rất nhiều, nó sẽ mất một thời gian để chạy - một hoặc hai phút, nhưng không làm tổn thương bất cứ điều gì. Một lần trong một thời gian nó sẽ thất bại vì không có đủ bộ nhớ trống để nó chạy, nhưng điều đó không gây ra bất kỳ vấn đề nào khác. Tôi phải khởi động lại để dọn dẹp mọi thứ khi điều đó xảy ra. Nó đã làm với những gì trông giống như một rò rỉ bộ nhớ trong truyền dẫn (kể từ khi cố định, tôi tin) và chỉ có 2GiB ram. - Joe
Nếu một cái gì đó đã được chuyển sang swap và nó vẫn còn trong trao đổi, đó là điều bình thường - nó có nghĩa là dữ liệu không thực sự được sử dụng, và nó giải phóng một số RAM của bạn cho các thứ khác, dẫn đến tăng tốc độ tiềm năng. Điều gì đã khiến bạn tin rằng dữ liệu này không nên trao đổi và thay vào đó nên chiếm nhiều RAM có giá trị hơn? Thông thường, hạt nhân khá giỏi khi biết những gì không được sử dụng, và có thể an toàn trong việc trao đổi để giải phóng RAM. - thomasrutter
@neon: Hãy nhớ rằng máy của tôi có RAM 2GB và 3 GB, tương ứng, khá ít trong những ngày này. Bằng chứng là hiệu suất. Ví dụ, đưa lên trình đơn hoặc chuyển đổi chương trình có thể được làm chậm do trao đổi, như có thể Compos hiệu ứng thị giác. Sự chậm chạp này được chữa khỏi bằng cách chuyển đổi hoán đổi, do đó chứng minh rằng ít nhất trong một số trường hợp, thuật toán tối ưu hóa của hạt nhân là tối ưu. Tôi không thể tranh luận với kinh nghiệm lặp đi lặp lại. - Scott Severance
Phew !! Điều này chỉ giảm xuống 0% của trao đổi .... Tôi không có nhiều thời gian để nhìn vào câu hỏi hoàn chỉnh này và câu trả lời của nó nhưng tôi thích nó để đọc nó khi tôi nhận được một số thời gian rảnh. - AzkerM
Tại sao bạn không chỉ đặt swappiness cho một giá trị thấp? Điều đó dường như đang làm điều tương tự như kịch bản của bạn, nhưng trong một thời trang được kiểm soát nhiều hơn. - jhfrontz


Nói chung trao đổi vẫn không sử dụng trên các hệ thống hiện nay-một-ngày. Theo kinh nghiệm của tôi, các tiến 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 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ể chuyển đổi swap bằng cách chạy lệnh:
swapoff -av (có thể bạn sẽ cần sudo quyền cho nó.)
Nếu bạn không thích swap, bạn có thể bật nó lên, sử dụng lệnh đối xứng:
swapon -av (lần nữa sudo cần thiết).


4
2018-06-29 22:24



Chuyển đổi hoàn toàn tắt là quá mức cần thiết vì swapiness = 0 thực hiện điều tương tự, nhưng an toàn hơn (nếu bạn làm kết thúc với quá nhiều thứ trong bộ nhớ, nó sẽ ném một cái gì đó trong trao đổi). - Brendan Long
@BrendanLong Điểm công bằng .. Cảm ơn bạn đã dạy tôi. :) - drake01


Sau khi trao đổi đã được sử dụng cho một chương trình nó có xu hướng vẫn được ánh xạ cho cuộc đờ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 .. Khi bộ nhớ được hoán đổi, nó không có khả năng đổi chỗ.

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 lần, 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ị hoán đổi (hoặc tập tin), nhưng nếu bạn thực sự cần không gian trao đổi, những thứ quyết liệt có thể xảy ra.

Bên cạnh những điều 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 rất nhiều đĩa tạm thời, nó có thể buộc các trang được hoán đổi. Một khi các tệp tạm thời được tạo có thể không còn được sử dụng sau một vài phút nữa và là các ứng cử viên tốt sẽ được chuyển sang thiết bị trao đổi.

Trong một pinch 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 tạm thời thêm không gian hoán đổi.


3
2018-06-30 04:02





Tôi đã chỉnh sửa kịch bản của Scott Severance để khớp với các phiên bản miễn phí mới hơn đã bao gồm tổng số 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

2
2017-10-03 13:37