Vấn đề
Tôi muốn kích hoạt các hoạt động TRIM nền trên phân vùng trao đổi trong đĩa SSD trên Linux. Theo một số bài viết, ví dụ như bài viết này , kernel phát hiện cấu hình này và tự động thực hiện các thao tác loại bỏ, nhưng trong các thử nghiệm của tôi dường như nó không hoạt động mặc dù tùy chọn gắn trên đĩa cứng được sử dụng để buộc hành vi này.
Kịch bản
- Debian Wheezy chạy Linux 3.2.0
- Đĩa SSD: 1 x 120GB OCZ Vertex 3 MI
- Phân vùng 2GB trao đổi đơn giản, phân vùng, các lớp khác (LVM, RAID, v.v.)
Lý lịch
Đây là các bước tôi làm theo để kiểm tra xem TRIM nền có hoạt động trên phân vùng trao đổi không:
Hỗ trợ TRIM : kiểm tra xem đĩa SSD có hỗ trợ các lệnh TRIM không và kernel gắn cờ thiết bị là không quay:
# hdparm -I /dev/sda | grep TRIM * Data Set Management TRIM supported (limit 1 block) * Deterministic read data after TRIM # cat /sys/block/sda/queue/rotational 0
Hoán đổi điền vào : gắn kết phân vùng, xóa tất cả bộ đệm VM và định cấu hình Linux để hoán đổi mạnh mẽ cài đặt vm.swappiness thành 100. Sau đó, chạy một tập lệnh phân bổ tất cả bộ nhớ có sẵn và buộc kernel bắt đầu hoán đổi:
# swapon [--discard] /dev/sda2 # echo 3 > /proc/sys/vm/drop_caches # echo 100 > /proc/sys/vm/swappiness # ./fill-up-memory.up
Kịch bản chạy một máy chủ với bộ nhớ vật lý 32 GB + phân vùng trao đổi 2 GB và tạo một đối tượng ~ 33,8 GB trong bộ nhớ, đủ để lấp đầy tất cả bộ nhớ và bắt đầu hoán đổi. Đây là một ví dụ về một kịch bản đạt được hành vi này:
#!/usr/bin/python mem = 33.8 testing = 'A' * int(1024 * 1024 * 1024 * mem) raw_input()
Kiểm tra nội dung trao đổi : Hoán đổi hoán đổi -s Cho thấy 100% bộ nhớ trao đổi được sử dụng. Bằng cách sử dụng hdparm --read-sector, tôi kiểm tra nội dung thô của các phân vùng trao đổi và tất cả các byte được đặt thành 1 4141, ký hiệu thập lục phân tương ứng cho ký tự của A A, mọi thứ hoạt động như mong đợi. Đây là một kịch bản ví dụ để đọc từng khu vực nội dung của phân vùng trao đổi:
#!/bin/bash for sector in `seq 194560 4100095` ; do hdparm --read-sector $sector /dev/sda done
LƯU Ý: bạn có thể lấy khu vực bắt đầu / kết thúc của phân vùng trao đổi bằng cách sử dụng parted, cfdisk, v.v.
Khi tôi dừng tập lệnh, nó sẽ giải phóng tất cả bộ nhớ bao gồm cả phân bổ trao đổi, trong đó, hoán đổi hoán đổi không có giá trị trao đổi trong hệ thống. Tại thời điểm này, Linux dự kiến sẽ bắt đầu loại bỏ nội dung của phân vùng trao đổi trong nền, nhưng nó không hoạt động , nội dung của các lĩnh vực vẫn là 4141, thậm chí vài giờ sau đó.
Tôi đã thực hiện một số thử nghiệm và dường như Linux chỉ thực hiện loại bỏ hoàn toàn khi phân vùng được bật bằng cách sử dụng swapon()
lệnh gọi hệ thống, nhưng không bao giờ ở chế độ nền, mặc dù các tùy chọn gắn kết của chế độ loại bỏ được bật trên / etc / fstab.
Nghiên cứu thêm: blkdev_su_discard () là hàm kernel chịu trách nhiệm gửi các lệnh TRIM đến các thiết bị SSD bên dưới, có hai tham chiếu duy nhất cho chức năng này trên mm/swapfile.c
:
discard_swap()
nó được gọi trong quá trình hoán đổi (), nếu tùy chọn loại bỏ chế độ gắn kết của chế độ ăn kiêng, nó sẽ loại bỏ tất cả nội dung, điều này sẽ hoạt động như mong đợi.discard_swap_cluster()
cần loại bỏ nội dung của một hoán đổi cụm, nhưng dường như nó không bao giờ thực hiện lệnh TRIM.
Câu hỏi: hành vi dự kiến của Linux trên các thiết bị trao đổi + SSD là gì? Nó nên loại bỏ tất cả các lĩnh vực / trang miễn phí hoặc chỉ đưa ra một loại bỏ hoàn toàn ban đầu khi phân vùng được kích hoạt trong quá trình khởi động? Cảm ơn.