Làm thế nào để tìm thấy những gì đang sử dụng trao đổi linux hoặc những gì trong trao đổi?


12

Tôi có máy chủ linux ảo (Fedora 17) với RAM 28 GB và trao đổi 2 GB. Máy chủ đang chạy MySQL DB được thiết lập để sử dụng hầu hết RAM.

Sau một thời gian chạy, máy chủ bắt đầu sử dụng trao đổi để trao đổi các trang không có yêu cầu. Điều đó cũng tốt vì tính dễ thay đổi của tôi là mặc định 60 và đó là hành vi được mong đợi.

Điều kỳ lạ là số trong top / meminfo không tương ứng với thông tin từ các quy trình. Tức là máy chủ đang báo cáo những con số này:

/proc/meminfo:
SwapCached:        24588 kB
SwapTotal:       2097148 kB
SwapFree:         865912 kB

top:
Mem:  28189800k total, 27583776k used,   606024k free,   163452k buffers
Swap:  2097148k total,  1231512k used,   865636k free,  6554356k cached

Nếu tôi sử dụng tập lệnh từ /server//a/423603/98204, nó báo cáo các số hợp lý (vài MB được hoán đổi bởi bash'es, systemd, v.v.) và một phân bổ lớn từ MySQL (tôi đã bỏ qua rất nhiều dòng đầu ra ):

892        [2442] qmgr -l -t fifo -u
896        [2412] /usr/libexec/postfix/master
904        [28382] mysql -u root
976        [27559] -bash
984        [27637] -bash
992        [27931] SCREEN
1000       [27932] /bin/bash
1192       [27558] sshd: admin@pts/0
1196       [27556] sshd: admin [priv]
1244       [1] /usr/lib/systemd/systemd
9444       [26626] /usr/bin/perl /bin/innotop
413852     [31039] /usr/libexec/mysqld --basedir=/usr --datadir=/data/mysql --plugin-dir=/usr/lib64/mysql/plugin --log-error=/data/mysql/err --open-files-limit=8192 --pid-file=/data/mysql/pid --socket=/data/mysql/mysql.sock --port=3306
449264   Total Swap Used

Vì vậy, nếu tôi nhận được đầu ra tập lệnh đúng, tổng mức sử dụng trao đổi sẽ là 449264K = ca. 440MB với mysql sử dụng ca. 90% trao đổi.

Câu hỏi là tại sao điều này khác rất nhiều so với số đầu và số meminfo? Có cách nào để "kết xuất" thông tin trao đổi để xem những gì thực sự có trong đó thay vì tóm tắt các tập quán hoán đổi từ tất cả các quy trình không?

Khi phân tích vấn đề tôi đã đưa ra những ý tưởng khác nhau nhưng tất cả đều có vẻ sai:

  1. Đầu ra tập lệnh không tính bằng KB. Ngay cả khi nó ở đơn vị 512 hoặc 4KB, nó sẽ không khớp. Trên thực tế, tỷ lệ (1200: 440) là khoảng 3: 1, đây là con số "lạ".
  2. Có một số trang trong trao đổi được chia sẻ bằng cách nào đó giữa các quy trình như được đề cập trong /server//a/477664/98204 . Nếu điều này là đúng, làm thế nào tôi có thể tìm thấy số lượng bộ nhớ thực tế được sử dụng như thế này? Tôi có nghĩa là nó sẽ cần phải tạo ra sự khác biệt 800 MB cca. Và điều đó không có vẻ đúng trong kịch bản này.
  3. Có một số trang "cũ" trong trao đổi được sử dụng bởi các quy trình đã hoàn thành. Tôi sẽ không bận tâm rằng nếu tôi có thể tìm ra sự hoán đổi "tự do" này là bao nhiêu.
  4. Có những trang hoán đổi đã được hoán đổi trở lại bộ nhớ và được hoán đổi chỉ trong trường hợp chúng không thay đổi RAM và cần được hoán đổi một lần nữa như đã đề cập trong /server//a/100636/98204 . Nhưng giá trị SwapCached chỉ là 24MB.

Điều kỳ lạ là việc sử dụng trao đổi đang tăng chậm trong khi tổng sản lượng từ tập lệnh gần như nhau. Trong 3 ngày qua, trao đổi được sử dụng đã tăng từ 1100MB lên 1230 MB hiện tại trong khi tổng số tiền tăng từ 430 MB lên 449 MB hiện tại (ca.).

Máy chủ có đủ RAM (có thể) miễn phí để tôi có thể tắt trao đổi và bật lại. Hoặc tôi có thể có thể đặt swappiness thành 0 để trao đổi chỉ được sử dụng nếu không có cách nào khác. Nhưng tôi muốn giải quyết vấn đề hoặc ít nhất là tìm ra nguyên nhân của việc này.


Giống như bạn nói, bạn chỉ nên đặt vm.swappiness = 0 (hoặc 1) và hoán đổi &&
hoán đổi

Nhưng điều đó sẽ không giải quyết được vấn đề. Tôi giả định rằng trao đổi sẽ bắt đầu tăng trở lại nếu tôi đặt swappines trở lại 60 hoặc hoàn toàn không được sử dụng nếu tôi giữ nó ở mức 0 hoặc 1 (trừ khi máy chủ hết bộ nhớ)
Radek Hladík

Nếu là Máy chủ DB, nó chỉ nên sử dụng trao đổi trong trường hợp khẩn cấp, do đó bạn phải luôn đặt nó thành 0 (hoặc 1).
HTTP500

Đó là sự thật và đó có lẽ là những gì tôi sẽ làm nếu tôi không tìm ra nguyên nhân của vấn đề này ... Mặt khác, có rất nhiều DB nhỏ trên máy chủ được sử dụng rất rời rạc và tôi thích ý tưởng về chúng bị tráo đổi bởi hệ thống khi chúng không được sử dụng ... Tuy nhiên tôi cho rằng MySQL sẽ có thể tự xử lý nó ...
Radek Hladík

Mysql thực hiện khá tốt công việc quản lý bộ nhớ cache của riêng mình, nhưng điều đó dựa trên các giả định về những gì thực tế trong bộ nhớ và những gì không. Nếu bạn cố gắng đoán hai lần bằng cách sử dụng bộ nhớ trao đổi, bạn chỉ làm suy yếu khả năng của mysql để quyết định những gì cần được lưu trữ và những gì không. Tắt trao đổi. NẾU bạn nhấn trao đổi, đó là một thất bại điều chỉnh. Điều chỉnh kích thước bộ đệm của bạn để trao đổi không bao giờ xảy ra, nhưng thiếu điều đó, bạn muốn sử dụng tất cả bộ nhớ vật lý có sẵn.
mc0e

Câu trả lời:


9

Fedora 18 trở lên có smemtrong repos. Bạn có thể tải tập lệnh python và cài đặt từ nguồn .

Đây là một đầu ra mẫu (hơi bị cắt và ẩn danh) từ máy của tôi:

# smem -s swap -t -k -n
  PID User     Command                         Swap      USS      PSS      RSS 
20917 1001     bash                               0     1.1M     1.1M     1.9M 
28329 0        python /bin/smem -s swap -t        0     6.3M     6.5M     7.4M 
 2719 1001     gnome-pty-helper               16.0K    72.0K    73.0K   516.0K 
  619 0        @sbin/mdadm --monitor --sca    28.0K    72.0K    73.0K   248.0K 

[big snip]

32079 42       gnome-shell --mode=gdm         41.9M     1.9M     2.0M     5.0M 
32403 1001     /opt/google/chrome/chrome -    43.1M   118.5M   119.4M   132.3M 
 4844 1002     /opt/google/chrome/chrome      48.1M    38.1M    41.9M    51.9M 
 5411 1002     /opt/google/chrome/chrome -    54.6M    33.4M    33.5M    36.8M 
 5624 1002     /opt/google/chrome/chrome -    72.4M    54.9M    55.5M    65.7M 
24328 1002     /opt/Adobe/Reader9/Reader/i    77.5M     1.9M     2.0M     5.2M 
 4921 1002     /opt/google/chrome/chrome -   147.2M   258.4M   259.4M   272.0M 
-------------------------------------------------------------------------------
  214 14                                       1.1G     1.1G     1.2G     1.7G 

Nguồn này cũng cung cấp smemcaprằng sẽ lưu trữ tất cả các dữ liệu liên quan để smem có thể được chạy trên đó sau này.

   To  capture  memory statistics on resource-constrained systems, the the
   smem source includes a utility named  smemcap.   smemcap  captures  all
   /proc entries required by smem and outputs them as an uncompressed .tar
   file to STDOUT.  smem can analyze the output using the --source option.
   smemcap is small and does not require Python.

1
Smem từ F17 repo không hoạt động (hiển thị danh sách trống) nhưng danh sách từ nguồn đã hoạt động và hiển thị các số gần như tương tự với các số khác :-) mysql 358.1M trên tổng số 392,6M, trong khi top cho thấy 1191224k được sử dụng
Radek Hladík

4

Bạn nên kiểm tra tập lệnh này trên máy khác, vì hệ thống của tôi hiển thị cách sử dụng trao đổi chính xác:

# Your_script.sh
111280   Total Swap Used
# free
Swap:     33551716     120368   33431348

Rất gần 111280 ~ = 120368.

Ngoài ra, hãy xem kịch bản này:

cho Proc trong / Proc / *; làm mèo $ Proc / smaps 2> / dev / null | awk '/ Swap / {exchange + = $ 2} END {hoán đổi in "\ t' readlink $proc/exe'"}'; xong | sắp xếp -n | awk '{tổng + = $ 1} / [0-9] /; END {in tổng "\ tTotal"}'

Từ chủ đề này:

/unix/71714/linux-total-swap- used-swap-used-by-Processes


Kịch bản được đề cập đang trả về kết quả tương tự ... 364920 / usr / libexec / mysqld 400372 Tổng cộng
Radek Hladík

Khi tôi thử tập lệnh trên máy chủ khác với mức sử dụng trao đổi rất thấp (50 MB), nó đã báo cáo tổng cộng
72 MB
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.