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:
- Đầ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ạ".
- 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.
- 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.
- 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.