
Trong bài viết này, chúng ta sẽ xem xét một số sắc thái của hệ thống con I/O và tác động của chúng đến hiệu suất.
Một vài tuần trước, tôi đã phải đối mặt với câu hỏi tại sao NVMe trên một máy chủ lại chậm hơn SATA trên một máy chủ khác. Tôi xem xét thông số kỹ thuật của máy chủ và nhận ra rằng đây là một câu hỏi khó: NVMe thuộc phân khúc người dùng và SSD thuộc phân khúc máy chủ.
Rõ ràng, sẽ không công bằng khi so sánh các sản phẩm từ các phân khúc khác nhau trong các môi trường khác nhau, nhưng đây không phải là câu trả lời kỹ thuật hoàn chỉnh. Hãy nghiên cứu những điều cơ bản, tiến hành thí nghiệm và đưa ra câu trả lời cho câu hỏi được đặt ra.
Fsync là gì và nó được sử dụng ở đâu?
Để tăng tốc độ làm việc với ổ đĩa, dữ liệu được lưu vào bộ đệm, nghĩa là được lưu trữ trong bộ nhớ dễ thay đổi cho đến khi có cơ hội thuận tiện để lưu nội dung của bộ đệm vào ổ đĩa. Tiêu chí cho một “cơ hội” được xác định bởi hệ điều hành và đặc điểm của ổ đĩa. Trong trường hợp mất điện, tất cả dữ liệu trong bộ đệm sẽ bị mất.
Có một số tác vụ mà bạn cần đảm bảo rằng những thay đổi đối với tệp sẽ được ghi vào ổ đĩa chứ không phải trong bộ đệm trung gian. Sự đảm bảo này có thể đạt được bằng cách sử dụng lệnh gọi hệ thống fsync tuân thủ POSIX. Gọi fsync buộc ghi từ bộ đệm vào ổ đĩa.
Hãy chứng minh tác dụng của bộ đệm bằng một ví dụ nhân tạo dưới dạng một chương trình ngắn trong C.
#include <fcntl.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
int main(void) {
/* Открываем файл answer.txt на запись, если его нет -- создаём */
int fd = open("answer.txt", O_WRONLY | O_CREAT);
/* Записываем первый набор данных */
write(fd, "Answer to the Ultimate Question of Life, The Universe, and Everything: ", 71);
/* Делаем вид, что проводим вычисления в течение 10 секунд */
sleep(10);
/* Записываем результат вычислений */
write(fd, "42n", 3);
return 0;
}Các bình luận giải thích rõ ràng trình tự các hành động trong chương trình. Văn bản “câu trả lời cho câu hỏi chính của cuộc sống, Vũ trụ và tất cả những thứ đó” sẽ được hệ điều hành đệm vào bộ đệm và nếu bạn khởi động lại máy chủ bằng cách nhấn nút Đặt lại trong khi “tính toán”, tệp sẽ trống. Trong ví dụ của chúng tôi, việc mất văn bản không phải là vấn đề nên không cần fsync. Cơ sở dữ liệu không chia sẻ sự lạc quan này.
Cơ sở dữ liệu là các chương trình phức tạp hoạt động đồng thời với nhiều tệp, vì vậy chúng muốn chắc chắn rằng dữ liệu chúng ghi sẽ được lưu trên ổ đĩa, vì tính nhất quán của dữ liệu bên trong cơ sở dữ liệu phụ thuộc vào điều này. Cơ sở dữ liệu được thiết kế để ghi lại tất cả các giao dịch đã hoàn thành và sẵn sàng mất điện bất cứ lúc nào. Hành vi này yêu cầu sử dụng fsync liên tục với số lượng lớn.
Việc sử dụng fsync thường xuyên có tác dụng gì?
Trong quá trình I/O thông thường, hệ điều hành cố gắng tối ưu hóa giao tiếp với đĩa, vì các ổ đĩa ngoài có tốc độ chậm nhất trong hệ thống phân cấp bộ nhớ. Do đó, hệ điều hành cố gắng ghi càng nhiều dữ liệu càng tốt trong một lần truy cập vào ổ đĩa.
Hãy chứng minh tác động của việc sử dụng fsync bằng một ví dụ cụ thể. Chúng tôi có các ổ SSD sau làm ổ đĩa thử nghiệm:
- SSD Intel® DC S4500 480 GB, được kết nối qua SATA 3.2, 6 Gbit/s;
- Samsung 970 EVO Plus 500GB, được kết nối qua PCIe 3.0 x4, ~31 Gbit/s.
Các bài kiểm tra được thực hiện trên bộ xử lý Intel® Xeon® W-2255 chạy hệ điều hành OS. Ubuntu Ngày 20 tháng 4. Phần mềm Sysbench 1.0.18 được sử dụng để kiểm tra ổ đĩa. Một phân vùng duy nhất, được định dạng là ext4, đã được tạo trên các ổ đĩa. Việc chuẩn bị cho bài kiểm tra bao gồm tạo các tệp có dung lượng 100 GB:
sysbench --test=fileio --file-total-size=100G prepareChạy thử nghiệm:
# Без fsync
sysbench --num-threads=16 --test=fileio --file-test-mode=rndrw --file-fsync-freq=0 run
# С fsync после каждой записи
sysbench --num-threads=16 --test=fileio --file-test-mode=rndrw --file-fsync-freq=1 runKết quả kiểm tra được trình bày trong bảng.
Thử nghiệm
Intel® S4500
Samsung 970 EVO+
Đọc không có fsync, MiB/s
5734.89
9028.86
Ghi âm không có fsync, MiB/s
3823.26
6019.24
Đọc với fsync, MiB/s
37.76
3.27
Ghi bằng fsync, MiB/s
25.17
2.18
Dễ dàng nhận thấy NVMe ở phân khúc client tự tin dẫn đầu khi hệ điều hành tự quyết định cách làm việc với ổ đĩa và thua khi sử dụng fsync. Điều này đặt ra hai câu hỏi:
- Tại sao tốc độ đọc trong bài kiểm tra không có fsync lại vượt quá băng thông vật lý của kênh?
- Tại sao SSD phân khúc máy chủ xử lý số lượng lớn yêu cầu fsync tốt hơn?
Câu trả lời cho câu hỏi đầu tiên rất đơn giản: sysbench tạo ra các tệp chứa đầy số không. Do đó, thử nghiệm đã được thực hiện trên 100 gigabyte số không. Vì dữ liệu rất đồng nhất và có thể dự đoán được nên nhiều hoạt động tối ưu hóa hệ điều hành khác nhau sẽ phát huy tác dụng và tăng tốc đáng kể tốc độ thực thi.
Nếu bạn đặt câu hỏi về tất cả các kết quả của sysbench, bạn có thể sử dụng fio.
# Без fsync
fio --name=test1 --blocksize=16k --rw=randrw --iodepth=16 --runtime=60 --rwmixread=60 --fsync=0 --filename=/dev/sdb
# С fsync после каждой записи
fio --name=test1 --blocksize=16k --rw=randrw --iodepth=16 --runtime=60 --rwmixread=60 --fsync=1 --filename=/dev/sdbThử nghiệm
Intel® S4500
Samsung 970 EVO+
Đọc không có fsync, MiB/s
45.5
178
Ghi âm không có fsync, MiB/s
30.4
119
Đọc với fsync, MiB/s
32.6
20.9
Ghi bằng fsync, MiB/s
21.7
13.9
Có thể thấy rõ xu hướng giảm hiệu suất NVMe khi sử dụng fsync. Bạn có thể chuyển sang trả lời câu hỏi thứ hai.
Tối ưu hóa hoặc lừa gạt
Trước đây, chúng tôi đã nói rằng dữ liệu được lưu trữ trong bộ đệm, nhưng chúng tôi không chỉ định bộ đệm nào vì điều này không quan trọng. Ngay cả bây giờ, chúng tôi sẽ không đi sâu vào sự phức tạp của hệ điều hành mà sẽ nêu bật hai loại bộ đệm chung:
- chương trình;
- phần cứng.
Bộ đệm phần mềm đề cập đến bộ đệm tồn tại trong hệ điều hành và bộ đệm phần cứng đề cập đến bộ nhớ khả biến của bộ điều khiển đĩa. Lệnh gọi hệ thống fsync sẽ gửi lệnh tới ổ đĩa để ghi dữ liệu từ bộ đệm của nó vào bộ lưu trữ chính nhưng không có cách nào để xác minh rằng lệnh đó có được thực thi chính xác hay không.
Vì SSD hiển thị kết quả tốt nhất nên có thể đưa ra hai giả định:
- đĩa được thiết kế cho tải tương tự;
- đĩa “lừa đảo” và bỏ qua lệnh.
Hành vi không trung thực của ổ đĩa có thể được nhận thấy nếu bạn tiến hành kiểm tra tổn thất điện năng. Bạn có thể kiểm tra điều này bằng một tập lệnh , đó là trong năm 2005.
Tập lệnh này yêu cầu hai máy vật lý - một “máy chủ” và một “máy khách”. Máy khách ghi một lượng nhỏ dữ liệu vào đĩa đang được kiểm tra, gọi fsync và gửi thông tin đến máy chủ về những gì đã được ghi.
# Запускается на сервере
./diskchecker.pl -l [port]
# Запускается на клиенте
./diskchecker.pl -s <server[:port]> create <file> <size_in_MB>Sau khi chạy tập lệnh, bạn phải tắt nguồn của “máy khách” và không cấp nguồn trở lại trong vài phút. Điều quan trọng là phải ngắt kết nối nguồn điện của người đang được kiểm tra chứ không chỉ thực hiện tắt máy cứng. Sau một thời gian, máy chủ có thể được kết nối và tải vào hệ điều hành. Sau khi tải hệ điều hành bạn cần khởi động lại nó diskchecker.pl, nhưng với một đối số xác minh.
./diskchecker.pl -s <server[:port]> verify <file>Khi kết thúc kiểm tra, bạn sẽ thấy số lượng lỗi. Nếu có 0 thì đĩa đã vượt qua bài kiểm tra. Để loại trừ sự trùng hợp may mắn đối với chiếc đĩa, thí nghiệm có thể được lặp lại nhiều lần.
S4500 của chúng tôi không có lỗi khi mất điện, nghĩa là nó sẵn sàng cho khối lượng công việc có nhiều cuộc gọi fsync.
Kết luận
Khi chọn đĩa hoặc toàn bộ cấu hình làm sẵn, bạn nên nhớ chi tiết cụ thể về các vấn đề cần giải quyết. Thoạt nhìn, có vẻ rõ ràng là NVMe, tức là ổ SSD có giao diện PCIe, nhanh hơn ổ SSD SATA “cổ điển”. Tuy nhiên, như chúng ta đã học hôm nay, trong những điều kiện cụ thể và với một số nhiệm vụ nhất định, điều này có thể không xảy ra.
Làm cách nào để kiểm tra các thành phần máy chủ khi thuê từ nhà cung cấp IaaS?
Chúng tôi đang chờ đợi bạn trong phần bình luận.
Nguồn: www.habr.com
