Tin tức và phân tích của tất cả các thiết bị di động

Làm thế nào nhanh là đĩa của bạn? Tìm ra cách nguồn mở, với fio

Phóng to / Ars Technica không khuyên bạn nên tháo vỏ bảo vệ khỏi đĩa cứng hoặc đốt lửa trong cài đặt sản xuất.

Lưu trữ điểm chuẩn lưu trữ giống như điểm chuẩn Wi-Fi là một nghệ thuật đen bị hiểu lầm rộng rãi. Quản trị viên và những người đam mê trong nhiều thập kỷ đã bị cám dỗ chỉ "lấy số lượng lớn" bằng cách đọc hoặc ghi một lượng lớn dữ liệu vào đĩa, nhận được một con số MB/ giây và gọi nó là một ngày. Thật không may, khối lượng công việc thực tế của một đĩa thông thường không giống như thế đó và "kiểm tra tốc độ đơn giản" không tái tạo nhiều nút thắt làm chậm truy cập đĩa trong các hệ thống trong thế giới thực.

Tất nhiên, cách thực tế nhất để kiểm tra và kiểm tra đĩa chuẩn là chỉ sử dụng chúng và xem điều gì sẽ xảy ra. Thật không may, điều đó không lặp lại nhiều, cũng không đơn giản để phân tích. Vì vậy, chúng tôi muốn có một công cụ đo điểm chuẩn nhân tạo, nhưng chúng tôi muốn một công cụ có thể sử dụng thông minh để kiểm tra các hệ thống lưu trữ trên các kịch bản thực tế mô hình hóa việc sử dụng hàng ngày của chúng tôi. May mắn thay, chúng ta không phải phát minh ra một công cụ như vậy. Đã có một công cụ phần mềm nguồn mở và miễn phí có tên là fio và thậm chí nó còn đa nền tảng!

Chúng tôi sẽ hướng dẫn bạn một số cách sử dụng đơn giản nhưng hiệu quả của fio trên Windows, Mac và máy tính Linux, nhưng trước khi chúng ta làm điều đó, hãy nói một chút về các hệ thống lưu trữ từ góc độ cơ bản hơn.

Thông lượng, độ trễ, IOPS và bộ đệm

Thông lượng

Thông lượng, được đo phổ biến nhất trong các hệ thống lưu trữ trong MB/ giây, là cách được sử dụng phổ biến nhất để nói về hiệu suất lưu trữ. Có một số điểm nghẹt thở trong một hệ thống lưu trữ cho thông lượng đầu tiên và quan trọng nhất, đó là tốc độ của chính phương tiện vật lý. Nếu bạn có một đầu duy nhất trên một đĩa gỉ thông thường quay với tốc độ 7200RPM, tốc độ bạn có thể lấy hoặc tắt dữ liệu của đĩa đó sẽ bị giới hạn bởi số lượng các khối / khối vật lý truyền bên dưới đầu. Ví dụ, bạn cũng bị giới hạn bởi băng thông của bộ điều khiển và cáp của bạn, các liên kết SATA hiện đại thường hoạt động ở tốc độ 6Gbps, trong khi các liên kết SAS hiện đại có thể hoạt động lên tới 22,5Gbps.

Mọi thứ trở nên phức tạp hơn một chút ở đây, bởi vì chúng tôi đang trộn các đơn vị, nhận thấy B lớn MB/ giây và b nhỏ trong Gbps. Đó là sự khác biệt giữa byte và bit. Bạn chia Gbps cho 8 để có được GB/ giây, sau đó nhân với 1024 để có được MB/ giây Vì vậy, một SATA-3 Về mặt lý thuyết, liên kết 6Gbps có thể di chuyển lên tới 768MB / giây. Bạn thực sự không thể di chuyển dữ liệu trên xe buýt SATA hoặc SAS ở tốc độ liên kết lý thuyết đầy đủ, nhưng bạn có thể đến khá gần. Cũng đáng lưu ý rằng hầu hết các bộ điều khiển SATA sẽ không di chuyển nhiều dữ liệu hơn một liên kết đơn có thể quản lý, ngay cả với nhiều đĩa được kết nối với bộ điều khiển. Vì vậy, người ta thường thấy thậm chí rất nhiều ổ đĩa trạng thái rắn rất nhanh bị tắc nghẽn xung quanh 700 MB/ giây

Độ trễ

Độ trễ là mặt trái của cùng một đồng tiền hiệu suất. Trong đó thông lượng đề cập đến số lượng byte dữ liệu mỗi giây bạn có thể di chuyển trên hoặc ra khỏi đĩa, độ trễ được đo phổ biến nhất tính bằng mili giây giây đề cập đến lượng thời gian cần thiết để đọc hoặc ghi một khối. Hầu hết các tắc nghẽn lưu trữ tồi tệ nhất là các vấn đề về độ trễ ảnh hưởng đến thông lượng, không phải là cách khác.

Trong các đĩa gỉ quay thông thường, có hai nguồn độ trễ chính: độ trễ quay và tìm độ trễ. Độ trễ tìm kiếm là mất bao lâu để di chuyển cánh tay cơ mà đầu đĩa được gắn vào rãnh chính xác trên đĩa. Khi đầu đã di chuyển đến đúng rãnh, ổ đĩa sẽ phải đợi đúng khu vực để quay bên dưới đầu Head đó là độ trễ quay. Sự kết hợp giữa độ trễ tìm kiếm và độ trễ quay thường cộng vào khoảng từ 15ms đến 25ms.

Bạn có thể thấy độ trễ ảnh hưởng đến thông lượng bằng thử nghiệm suy nghĩ. Nếu chúng ta có một đĩa quay nhanh hợp lý với thông lượng tối đa 180MB / giây và tổng độ trễ truy cập là 16ms, và chúng tôi trình bày nó với khối lượng công việc bị phân mảnh tối đa có nghĩa là không có hai khối được viết / đang được viết theo thứ tự tuần tự chúng ta có thể làm một bài toán nhỏ để đưa ra thông lượng đó. Giả sử các khối vật lý 4KB trên đĩa, 4KB cho mỗi lần tìm kiếm chia cho 00,016 giây cho mỗi lần tìm kiếm = chỉ 250KB / giây. Ôi!

IOPS

Viết tắt của các hoạt động đầu vào / đầu ra mỗi giây, IOPS là số liệu đo lường mà bạn thường nghe nhất khi các kỹ sư lưu trữ thực sự thảo luận. Nó có nghĩa chính xác những gì nghe giống như dịch vụ đĩa có bao nhiêu hoạt động khác nhau? Theo cùng một cách, "thông lượng" thường đề cập đến thông lượng tối đa của đĩa, với số lần đọc hoặc ghi rất lớn và có thể tuần tự, IOPS thường đề cập đến số lượng hoạt động tối đa mà một đĩa có thể phục vụ trên các lần đọc ngẫu nhiên 4K kết thúc thấp và viết.

Các đĩa trạng thái rắn không gặp phải độ trễ tìm kiếm hoặc quay, nhưng Đầu vào / Đầu ra ngẫu nhiên 4K (I / O) vẫn gặp sự cố. Dưới vỏ bọc, SSD tiêu dùng thực sự không phải là một "đĩa" đơn giản là một mảng RAID trong một hộp kín, với bộ điều khiển phức tạp của chính nó bên trong đĩa tự quản lý đọc và ghi. Bản thân bộ điều khiển SSD cố gắng ghi sọc trên nhiều kênh phương tiện flash vật lý song song và nếu người dùng may mắn, thì ghi bị sọc đều trên các kênh đó cũng sẽ được đọc theo cách tương tự, tối đa hóa thông lượng.

Khi một đĩa trạng thái rắn được trình bày với khối lượng công việc I / O ngẫu nhiên 4K, nếu nó không thể tìm ra cách nào đó để tổng hợp và song song hóa các yêu cầu, nó sẽ kết thúc việc tắc nghẽn ở tốc độ thấp hơn nhiều, được quyết định bởi một ô nhanh như thế nào phương tiện flash có thể đọc hoặc viết một khối dữ liệu. Tác động không đáng kể như trên đĩa gỉ, nhưng nó vẫn rất quan trọng khi một đĩa gỉ có khả năng lưu lượng 180MB / giây có thể giảm xuống 250KB / giây của I / O ngẫu nhiên 4K, SSD có khả năng 500MB / giây có thể giảm xuống khoảng 40MB / giây.

Mặc dù bạn có thể thảo luận về thông lượng về I / O ngẫu nhiên 4K và IOPS về I / O tuần tự 1MB, đó không phải là cách mỗi thuật ngữ thường được sử dụng. Nhìn chung, bạn nên mong đợi thông lượng sẽ được thảo luận về mức độ dữ liệu của một đĩa di chuyển trong điều kiện tối ưu và IOPS trong điều kiện "cấp thấp" là đĩa có khả năng thậm chí dưới khối lượng công việc tồi tệ nhất. Đối với việc sử dụng máy tính để bàn thông thường, IOPS quan trọng hơn nhiều so với thông lượng thông qua vì có rất nhiều I / O ngẫu nhiên 4K chậm đó và nó làm chậm toàn bộ hệ thống khi nó xảy ra.

Bộ nhớ cache

Như chúng ta đã thấy ở trên, khối lượng công việc không được tối ưu hóa làm giảm hiệu suất và làm tổn thương chúng tệ. Rất may cho người dùng, hàng thập kỷ nghiên cứu và phát triển đã trình bày cho chúng tôi tất cả các thủ thuật để tránh khám phá các đặc tính hiệu suất tồi tệ nhất của kho lưu trữ của chúng tôi, đặc biệt là lưu trữ rỉ sét. Hệ điều hành sử dụng cả bộ đệm đọc và bộ đệm ghi để giảm thiểu số lượng tìm kiếm cần thiết trong hoạt động và tránh việc phải đọc các khối cần thiết thường xuyên từ lưu trữ nhiều lần.

Bộ đệm ghi cho phép hệ điều hành lưu trữ nhiều yêu cầu I / O nhỏ và cam kết chúng vào đĩa theo lô lớn. Một megabyte là một lượng dữ liệu rất nhỏ, nhưng nó vẫn có tới 256 khối 4KB và nếu bạn phải ghi từng khối đó ra với các thao tác riêng lẻ, bạn có thể buộc toàn bộ dung lượng dịch vụ của ổ đĩa trong một giây. Mặt khác, nếu bạn có thể tổng hợp 256 khối đó trong bộ đệm ghi và sau đó xóa chúng trong một thao tác, bạn sẽ tránh được tất cả độ trễ truy cập đó và cùng một lượng dữ liệu có thể được lưu trong một phần trăm giây hoặc ít hơn . Tập hợp này cũng có thể giúp rất nhiều với tốc độ đọc sau này. Nếu hầu hết các khối giống nhau cần được đọc thành một nhóm sau đó, ổ đĩa có thể tránh tìm kiếm giữa chúng vì chúng đều được viết thành một nhóm ở vị trí đầu tiên.

Đọc bộ đệm giúp hệ thống không phải kết nối bộ nhớ với các yêu cầu lặp lại không cần thiết cho cùng một khối nhiều lần. Nếu hệ điều hành của bạn có sẵn nhiều RAM, mỗi lần nó đọc dữ liệu từ đĩa, nó sẽ giữ một bản sao của nó nằm xung quanh trong bộ nhớ. Nếu một chương trình khác yêu cầu các khối tương tự sau đó, hệ điều hành có thể phục vụ yêu cầu đó trực tiếp từ bộ nhớ cache, bộ nhớ này giữ cho các tài nguyên giới hạn của ổ đĩa có sẵn cho các yêu cầu đọc hoặc ghi, phải nhấn vào đĩa thực tế.

Một số kiểu máy SSD có bộ đệm ghi không bay hơi bổ sung trên đĩa, được làm bằng loại phương tiện flash nhanh hơn và đắt tiền hơn. Ví dụ: SSD TLC hoặc QLC (Quad Layer Cell) có thể có một vài gigabyte phương tiện MLC (Multi-Layer Cell) để sử dụng làm bộ đệm để ghi; điều này cho phép SSD theo kịp tốc độ ghi được yêu cầu bởi khối lượng công việc của máy tính để bàn thông thường bằng cách sử dụng bộ đệm MLC nhanh hơn nhưng nếu được trình bày với khả năng ghi nặng kéo dài quá lâu, bộ đệm MLC nhanh sẽ lấp đầy và thông lượng giảm xuống mức TLC chậm hơn hoặc Phương tiện QLC có thể quản lý. Điều này thường có thể là một kịch bản loại "rơi ra khỏi vách đá", vì phương tiện chậm hơn thường không chỉ phải duy trì việc ghi liên tục, mà còn làm như vậy trong khi tiếp tục truyền ra các ghi đã được chấp nhận từ bộ đệm MLC nhanh.

Mô hình hóa truy cập lưu trữ thực tế

Bây giờ chúng ta đã hiểu một chút về các điểm đau trong hệ thống lưu trữ, một điều khá rõ ràng là chúng ta không nên sử dụng một công cụ đơn giản như dd để đọc hoặc ghi các khối dữ liệu khổng lồ và tạo ra số lượng lớn. Những con số khổng lồ đó không thực sự tương quan rất tốt với cách mỗi đĩa hoạt động dưới khối lượng công việc thực tế hơn, vì vậy, chúng tôi muốn tạo ra các mẫu truy cập thực tế hơn để kiểm tra.

Đây là nơi mà fio xuất hiện. Fio là viết tắt của Trình kiểm tra đầu vào / đầu ra linh hoạt và có thể được cấu hình để mô hình hóa gần như mọi khối lượng công việc lưu trữ dưới ánh mặt trời. Ít nhất là các kỹ sư lưu trữ thực sự, những người đang thực hiện công việc của họ ngay trước tiên sẽ phân tích các mẫu truy cập lưu trữ thực tế của máy chủ hoặc dịch vụ, sau đó viết các tập lệnh fio để mô hình hóa các mẫu chính xác đó. Bằng cách này, họ có thể kiểm tra một đĩa hoặc mảng không chỉ cho hiệu suất chung của nó, mà hiệu suất của nó rất phù hợp với khối lượng công việc chính xác của họ.

Chúng tôi sẽ không hoàn toàn cụ thể ở đây, nhưng chúng tôi sẽ sử dụng fio để mô hình hóa và báo cáo về một số mô hình sử dụng chính phổ biến cho máy tính để bàn và lưu trữ máy chủ. Điều quan trọng nhất trong số này là I / O ngẫu nhiên 4K, mà chúng ta đã thảo luận ở phần trên. 4K ngẫu nhiên là nơi nỗi đau tồn tại. Đó là lý do máy tính nhanh đẹp của bạn với ổ cứng thông thường đột nhiên phát ra âm thanh như đang nghiền cà phê và khiến bạn muốn nói xấu nó trong sự thất vọng.

Tiếp theo, chúng tôi xem xét 64K I / O ngẫu nhiên, trong mười sáu quy trình song song. Đây là một khối lượng công việc giữa đường cho một máy tính bận rộn, có rất nhiều yêu cầu cho lượng dữ liệu tương đối nhỏ, nhưng cũng có rất nhiều quy trình song song; trên một hệ thống hiện đại, số lượng lớn các quy trình song song đó là tốt, bởi vì nó có khả năng cho phép HĐH tổng hợp rất nhiều yêu cầu nhỏ thành một vài yêu cầu lớn hơn. Mặc dù không có hình phạt nào là I / O ngẫu nhiên 4K, nhưng I / O ngẫu nhiên 64K là đủ để làm chậm đáng kể hầu hết các hệ thống lưu trữ.

Cuối cùng, chúng tôi xem xét thông lượng cao cấp của một số con số lớn nhất mà bạn có thể mong đợi để thấy ngoài hệ thống bằng cách sử dụng I / O ngẫu nhiên 1MB. Về mặt kỹ thuật, bạn vẫn có thể có được một nhẹ nhàng số lượng lớn hơn bằng cách yêu cầu fio tạo ra các yêu cầu thực sự tuần tự, nhưng trong thế giới thực, chúng rất hiếm. Nếu hệ điều hành của bạn cần ghi một vài dòng vào nhật ký hệ thống hoặc đọc một vài KB dữ liệu từ thư viện hệ thống, thì việc đọc hoặc ghi "tuần tự" của bạn sẽ ngay lập tức trở thành I / O ngẫu nhiên khi nó chia sẻ thời gian với quá trình khác.

Cài đặt fio

Windows

Bạn có thể tìm Windows trình cài đặt cho fio tại https://bsdio.com/fio/. Note rằng bạn có thể nhận được cảnh báo Smartscreen khi chạy một trong những trình cài đặt này, vì chúng không được ký điện tử. Các gói này được cung cấp bởi Rebecca Cran và có sẵn mà không cần bảo hành.

Note cái đó Windows có một lựa chọn hạn chế các ioengines có sẵn, nó sẽ thông báo cho bạn lựa chọn các đối số dòng lệnh sau này. Hầu hết, Windows người dùng nên sử dụng –ioengine = windowsaio (Đầu vào / đầu ra không đồng bộ) với các đối số fio của họ.

Linux / FreeBSD

Các hướng dẫn cho người dùng phân phối Linux và BSD có một chút khác biệt so với cái khác, nhưng fio có trong gần như tất cả các kho lưu trữ chính vì vậy nó sôi sục cài đặt fio cho đại đa số.

Debian hoặc Ubuntu: sudo apt cài đặt fio

FreeBSD: sudo pkg cài đặt fio

CentOS (và Red Hat Enterprise Linux) có kho lưu trữ chính hạn chế hơn so với hầu hết các bản phân phối; nếu bạn chưa có, bạn sẽ cần thêm kho EPEL vào CentOS / RHEL để lấy fio.

CentOS / RHEL: sudo yum cài đặt epel-phát hành -y; sudo yum cài đặt fio

Bạn có được ý tưởng.

Hệ điều hành Mac

Trên máy Mac, bạn sẽ muốn cài đặt fio qua brew. Nếu bạn chưa cài đặt brew, tại Terminal, hãy ra lệnh sau:

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

Một mặt, trên là thủ tục ghê tởm; mặt khác, bạn có thể xác nhận rằng tập lệnh được kéo xuống cho bạn biết mọi thứ sẽ làm, trước khi thực hiện và tạm dừng để cho phép bạn đồng ý với nó. Nếu bạn đủ hoang tưởng, bạn có thể muốn tải xuống tệp, kiểm tra tệp và sau đó chạy nó dưới dạng các bước riêng biệt thay thế. Note rằng tập lệnh cài đặt homebrew không cần đặc quyền sudo, và trên thực tế, sẽ từ chối chạy nếu bạn cố gắng thực thi nó bằng sudo.

Với cài đặt Brew, bây giờ bạn có thể cài đặt fio dễ dàng:

brew install fio

Sử dụng fio

Bây giờ bạn có thể sử dụng fio để lưu trữ điểm chuẩn. Đầu tiên, thay đổi thư mục thành vị trí bạn thực sự muốn kiểm tra: nếu bạn chạy fio trong thư mục chính của mình, bạn sẽ kiểm tra đĩa bên trong máy tính của mình và nếu bạn chạy nó trong một thư mục nằm trên đĩa di động USB, bạn sẽ được điểm chuẩn đĩa di động. Khi bạn đã có một dấu nhắc lệnh ở đâu đó trong đĩa bạn muốn kiểm tra, bạn đã sẵn sàng để thực sự chạy fio.

Fio đầu tiên của bé chạy

Trước tiên, chúng tôi sẽ kiểm tra cú pháp cần thiết cho một bài kiểm tra ghi ngẫu nhiên 4K đơn giản. (Windows người dùng: thay thế –ioengine = windowsaio cho –ioengine = posixaio trong cả hai lệnh này và tương lai.)

fio --name=random-write --ioengine=posixaio --rw=randwrite --bs=4k --numjobs=1 --size=4g --iodepth=1 --runtime=60 --time_based --end_fsync=1

Hãy chia nhỏ những gì từng đối số làm.

–name = là một đối số bắt buộc, nhưng về cơ bản, fluff thân thiện với con người, Fio sẽ tạo các tệp dựa trên tên đó để kiểm tra, bên trong thư mục làm việc mà bạn hiện đang ở.

–ioengine = posixaio đặt chế độ fio tương tác với hệ thống tập tin. POSIX là một tiêu chuẩn Windows, Mac, Linux và BSD đều hiểu, vì vậy thật tuyệt vời cho tính di động, mặc dù bên trong chính fio, Windows người dùng cần phải gọi –ioengine = windowsaio, không –ioengine = posixaio, thật không may. AIO là viết tắt của Đầu ra đầu vào không đồng bộ và có nghĩa là chúng ta có thể xếp hàng nhiều thao tác sẽ được hoàn thành theo bất kỳ thứ tự nào mà HĐH quyết định hoàn thành chúng. (Trong ví dụ cụ thể này, các đối số sau này vô hiệu hóa hiệu quả này.)

–rw = randwrite có nghĩa chính xác là nó trông như thế nào: chúng ta sẽ thực hiện các thao tác ghi ngẫu nhiên vào các tệp thử nghiệm của mình trong thư mục làm việc hiện tại. Các tùy chọn khác bao gồm seqread, seqwrite, randread và randrw, tất cả đều hy vọng sẽ khá tự giải thích.

–bs = 4k chặn kích thước 4K. Đây là những hoạt động cá nhân rất nhỏ. Đây là nơi nỗi đau sống; nó cứng trên đĩa và điều đó cũng có nghĩa là rất nhiều chi phí phụ trong SATA, USB, SAS, SMB hoặc bất kỳ kênh lệnh nào khác nằm giữa chúng tôi và các đĩa, vì một thao tác riêng biệt phải được chỉ huy cho mỗi 4K dữ liệu .

–size = 4g (các) tệp thử nghiệm của chúng tôi sẽ có kích thước 4GB mỗi lần. (Chúng tôi chỉ tạo một, xem đối số tiếp theo.)

–numjobs =1 chúng tôi chỉ tạo một tệp duy nhất và chạy một hoạt động chỉ huy quy trình trong tệp đó. Nếu chúng tôi muốn mô phỏng nhiều quy trình song song, chúng tôi sẽ làm, ví dụ: –numjobs = 16, sẽ tạo 16 tệp thử nghiệm riêng biệt có kích thước – và 16 quy trình riêng biệt hoạt động cùng một lúc.

–iodepth =1 đây là mức độ sâu sắc mà chúng tôi sẵn sàng thử xếp các lệnh trong hàng đợi của hệ điều hành. Vì chúng tôi đặt cái này thành 1, điều này thực sự khá giống với công cụ IO đồng bộ hóa Chúng tôi chỉ yêu cầu một thao tác tại một thời điểm và HĐH phải xác nhận đã nhận được mọi hoạt động mà chúng tôi yêu cầu trước khi chúng tôi có thể yêu cầu một hoạt động khác. (Nó không phải đáp ứng yêu cầu trước khi chúng tôi yêu cầu nó thực hiện nhiều thao tác hơn, nó chỉ phải thừa nhận rằng chúng tôi thực sự đã yêu cầu nó.)

–r nb = 60 –time_basing Chạy trong sáu mươi giây, và ngay cả khi chúng tôi hoàn thành sớm hơn, chỉ cần bắt đầu lại và tiếp tục cho đến khi hết 60 giây.

–end_fsync =1 Sau khi tất cả các hoạt động đã được xếp hàng, hãy tiếp tục hẹn giờ cho đến khi HĐH báo cáo rằng lần cuối cùng chúng đã được hoàn thành thành công, tức là thực sự được ghi vào đĩa.

Giải thích đầu ra của fio

Đây là toàn bộ đầu ra từ I / O ngẫu nhiên 4K chạy trên máy trạm Ubuntu của tôi:

root@banshee:/tmp# fio --name=random-write --ioengine=posixaio --rw=randwrite --bs=4k --size=4g --numjobs=1 --runtime=60 --time_based --end_fsync=1
random-write: (g=0): rw=randwrite, bs=(R) 4096B-4096B, (W) 4096B-4096B, (T) 4096B-4096B, ioengine=posixaio
fio-3.12
Starting 1 process
Jobs: 1 (f=1): (w(1))(100.0%)(eta 00m:00s)                          
random-write: (groupid=0, jobs=1): err= 0: pid=16109: Wed Feb  5 15:09:36 2020
  write: IOPS=32.5k, BW=127MiB/s (133MB/s)(8192MiB/64602msec); 0 zone resets
    slat (nsec): min=250, max=555439, avg=1388.31, stdev=833.19
    clat (nsec): min=90, max=20251k, avg=9642.34, stdev=179381.02
     lat (usec): min=3, max=20252, avg=11.03, stdev=179.39
    clat percentiles (usec):
     |  1.00th=(    4),  5.00th=(    4), 10.00th=(    4), 20.00th=(    5),
     | 30.00th=(    6), 40.00th=(    6), 50.00th=(    7), 60.00th=(    8),
     | 70.00th=(    9), 80.00th=(   10), 90.00th=(   11), 95.00th=(   12),
     | 99.00th=(   17), 99.50th=(   20), 99.90th=(   43), 99.95th=(   77),
     | 99.99th=(12387)
   bw (  KiB/s): min=22256, max=613312, per=100.00%, avg=335527.28, stdev=162778.06, samples=50
   iops        : min= 5564, max=153328, avg=83881.88, stdev=40694.66, samples=50
  lat (nsec)   : 100=0.01%, 250=0.01%, 500=0.01%, 750=0.01%, 1000=0.01%
  lat (usec)   : 2=0.01%, 4=13.96%, 10=68.85%, 20=16.68%, 50=0.41%
  lat (usec)   : 100=0.04%, 250=0.01%, 500=0.01%, 750=0.01%, 1000=0.01%
  lat (msec)   : 2=0.01%, 10=0.01%, 20=0.01%, 50=0.01%
  cpu          : usr=6.35%, sys=11.96%, ctx=2348924, majf=0, minf=48
  IO depths    : 1=100.0%, 2=0.0%, 4=0.0%, 8=0.0%, 16=0.0%, 32=0.0%, >=64=0.0%
     submit    : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
     complete  : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
     issued rwts: total=0,2097153,0,1 short=0,0,0,0 dropped=0,0,0,0
     latency   : target=0, window=0, percentile=100.00%, depth=1

Run status group 0 (all jobs):
  WRITE: bw=127MiB/s (133MB/s), 127MiB/s-127MiB/s (133MB/s-133MB/s), io=8192MiB (8590MB), run=64602-64602msec

Disk stats (read/write):
    md0: ios=71/749877, merge=0/0, ticks=0/0, in_queue=0, util=0.00%, aggrios=351/737911, aggrmerge=0/12145, aggrticks=1875/260901, aggrin_queue=30910, aggrutil=83.73%
  sdb: ios=342/737392, merge=0/12663, ticks=1832/241034, in_queue=28672, util=83.35%
  sda: ios=361/738430, merge=0/11628, ticks=1918/280768, in_queue=33148, util=83.73%

Điều này có vẻ như rất nhiều. Nó rất nhiều! Nhưng chỉ có một phần mà bạn có thể quan tâm, trong hầu hết các trường hợp, hãy đặt trực tiếp vào dòng "Chạy nhóm trạng thái 0 (tất cả các công việc): "là công việc có thông lượng tổng hợp. Fio có khả năng chạy song song nhiều công việc khác nhau như bạn muốn thực hiện các mô hình khối lượng công việc phức tạp. Nhưng vì chúng tôi chỉ chạy một nhóm công việc, chúng tôi ' ve chỉ có một dòng tổng hợp để xem qua.

Run status group 0 (all jobs):
  WRITE: bw=127MiB/s (133MB/s), 127MiB/s-127MiB/s (133MB/s-133MB/s), io=8192MiB (8590MB), run=64602-64602msec

Đầu tiên, chúng ta đang thấy đầu ra ở cả MiB / giây và MB/ giây MiB có nghĩa là "mebibytes", được bảo vệ bởi quyền hạn của hai đội trong đó MB có nghĩa là "megabyte", được đo bằng sức mạnh của mười. Mebibytes, 1024×1024 byte, là những gì hệ điều hành và hệ thống tập tin thực sự đo lường dữ liệu, vì vậy đó là cách đọc mà bạn quan tâm.

Run status group 0 (all jobs):
  WRITE: bw=127MiB/s (133MB/s), 127MiB/s-127MiB/s (133MB/s-133MB/s), io=8192MiB (8590MB), run=64602-64602msec

Ngoài việc chỉ có một nhóm công việc duy nhất, chúng tôi chỉ có một công việc duy nhất trong thử nghiệm này, chúng tôi không yêu cầu fio chạy, ví dụ, chạy mười sáu quy trình ghi ngẫu nhiên 4K song song, do đó, mặc dù bit thứ hai hiển thị phạm vi tối thiểu và tối đa, trong trường hợp này, nó chỉ là sự lặp lại của tổng hợp. Nếu chúng ta có nhiều quy trình, chúng ta sẽ thấy quy trình chậm nhất đến quy trình nhanh nhất được trình bày ở đây.

Run status group 0 (all jobs):
  WRITE: bw=127MiB/s (133MB/s), 127MiB/s-127MiB/s (133MB/s-133MB/s), io=8192MiB (8590MB), run=64602-64602msec

Cuối cùng, chúng tôi nhận được tổng số I / O phiên bản 8192MiB được ghi vào đĩa, trong 64602 mili giây. Chia 8192MiB cho 64.602 giây và thật bất ngờ, bạn nhận được 126,8MiB / giây Vòng tròn lên tới 127MiB / giây, và đó chỉ là những gì fio đã nói với bạn trong khối đầu tiên của dòng cho tổng thông lượng.

Nếu bạn thắc mắc tại sao fio lại viết 8192MiB thay vì chỉ 4096MiB trong lần chạy này mặc dù đối số của chúng tôi là 4g và chỉ có một tiến trình chạy trên nó vì chúng tôi đã sử dụng –time_basing và –r nb = 60. Và vì chúng tôi đang thử nghiệm trên một phương tiện lưu trữ nhanh, chúng tôi đã cố gắng lặp lại toàn bộ quá trình ghi hai lần trước khi kết thúc.

Bạn có thể chọn nhiều số liệu thống kê thú vị hơn từ đầu ra fio đầy đủ, bao gồm tỷ lệ phần trăm sử dụng, IOPS trên mỗi quy trình và sử dụng CPU, nhưng với mục đích của chúng tôi, chúng tôi sẽ tiếp tục với thông lượng tổng hợp từ đây trở đi.

Ars đề nghị kiểm tra

Quá trình ghi ngẫu nhiên 4KiB đơn

fio –name = Random-write –ioengine = posixaio –rw = randwrite –bs = 4k –size = 4g –numjobs =1 –iodepth =1 –r nb = 60 –time_basing –end_fsync =1

Đây là một quá trình duy nhất thực hiện ghi 4K ngẫu nhiên. Đây là nơi nỗi đau thực sự, thực sự sống; về cơ bản, đó là điều tồi tệ nhất bạn có thể yêu cầu một đĩa để làm. Trường hợp điều này xảy ra thường xuyên nhất trong cuộc sống thực: sao chép thư mục gốc và dotfiles, thao tác công cụ email, một số hoạt động cơ sở dữ liệu, cây mã nguồn.

Khi tôi chạy thử nghiệm này với các ổ SSD hiệu năng cao trong máy trạm Ubuntu của tôi, chúng đã đẩy 127MiB / giây. Máy chủ ngay bên dưới giá chỉ quản lý 33MiB / giây trên các đĩa rỉ 7200RPM "hiệu suất cao" của nó … nhưng ngay cả khi đó, phần lớn tốc độ đó là do dữ liệu được ghi không đồng bộ, cho phép hệ điều hành bó nó thành các hoạt động ghi lớn hơn, hiệu quả hơn.

Nếu chúng ta thêm đối số –fsync =1, buộc hệ điều hành phải thực hiện ghi đồng bộ (gọi fsync sau khi mỗi khối dữ liệu được ghi), hình ảnh trở nên nghiệt ngã hơn nhiều: 2.6MiB / giây trên ổ SSD hiệu năng cao nhưng chỉ có 184KiB / giây khi bị rỉ sét "hiệu suất cao". Các ổ SSD nhanh hơn khoảng bốn lần so với rỉ sét khi dữ liệu được ghi không đồng bộ nhưng chỉ là một con số khổng lồ mười bốn nhanh hơn lần khi giảm đến trường hợp xấu nhất.

16 quá trình ghi ngẫu nhiên 64KiB song song

fio –name = Random-write –ioengine = posixaio –rw = randwrite –bs = 64k –size = 256m –numjobs = 16 –iodepth = 16 –r nb = 60 –time_basing –end_fsync =1

Lần này, chúng tôi đang tạo 16 tệp 256 MB riêng biệt (vẫn có tổng dung lượng 4GB, khi tất cả được đặt cùng nhau) và chúng tôi đang phát hành các hoạt động ghi ngẫu nhiên bị chặn 64KB. Chúng tôi đang thực hiện với mười sáu quy trình riêng biệt chạy song song và chúng tôi đang xếp hàng lên tới 16 ops không đồng bộ đồng thời trước khi chúng tôi tạm dừng và chờ HĐH bắt đầu xác nhận đã nhận.

Đây là một xấp xỉ khá tốt của một hệ thống bận rộn đáng kể. Nó không làm bất cứ điều gì đặc biệt khó chịu, giống như chạy một công cụ cơ sở dữ liệu hoặc sao chép hàng tấn dotfiles từ thư mục nhà của người dùng nhưng nó đang đối phó với một loạt các ứng dụng thực hiện mọi thứ yêu cầu vừa phải cùng một lúc.

Đây cũng là một xấp xỉ khá tốt, hơi gần bi quan của một hệ thống nhiều người dùng bận rộn như NAS, cần xử lý đồng thời nhiều hoạt động 1MB cho các người dùng khác nhau. Nếu một số người hoặc quá trình đang cố gắng đọc hoặc ghi các tệp lớn (ảnh, phim, bất cứ thứ gì) cùng một lúc, HĐH sẽ cố gắng cung cấp cho họ tất cả dữ liệu cùng một lúc. Điều này khá nhanh chóng phá hủy xuống một mô hình của nhiều truy cập khối nhỏ ngẫu nhiên. Vì vậy, ngoài "máy tính để bàn bận rộn với nhiều ứng dụng", hãy nghĩ rằng "máy chủ tệp bận rộn với nhiều người tích cực sử dụng nó".

Bạn sẽ thấy tốc độ thay đổi nhiều hơn khi bạn xem thao tác này diễn ra trên bảng điều khiển. Ví dụ, thử nghiệm quy trình đơn 4K mà chúng tôi đã thử trước tiên đã viết 11MiB / giây khá nhất quán trên ổ đĩa trong của MacBook Air nhưng công việc 16 quy trình này dao động trong khoảng 10MiB / giây và 300MiB / giây trong khi chạy, kết thúc với mức trung bình là 126MiB / giây.

Hầu hết các biến thể bạn thấy ở đây là do hệ điều hành và phần sụn SSD đôi khi có thể tổng hợp nhiều lần ghi. Khi nó quản lý để tổng hợp chúng một cách hữu ích, nó có thể ghi chúng theo cách cho phép ghi song song vào tất cả các sọc phương tiện vật lý riêng lẻ bên trong SSD. Đôi khi, cuối cùng vẫn phải từ bỏ và chỉ ghi vào một dải phương tiện vật lý duy nhất tại một thời điểm, bộ sưu tập rác hoặc hoạt động bảo trì khác ở cấp độ chương trình cơ sở SSD cần chạy nhanh trong nền, làm chậm mọi thứ.

Quá trình viết ngẫu nhiên 1MiB

fio –name = Random-write –ioengine = posixaio –rw = randwrite –bs = 1m –size = 16g –numjobs =1 –iodepth =1 –r nb = 60 –time_basing –end_fsync =1

Điều này khá gần với kịch bản trường hợp tốt nhất cho một hệ thống trong thế giới thực làm những việc trong thế giới thực. Không, nó không hoàn toàn nhanh như một bản viết đơn, thực sự liền kề … nhưng kích thước khối 1MiB đủ lớn để nó khá gần. Ngoài ra, nếu nghĩa đen là bất kỳ hoạt động đĩa nào khác được yêu cầu đồng thời với một ghi liền kề, thì ghi "liền kề" sẽ phá hủy mức hiệu năng này ngay lập tức, vì vậy đây là một thử nghiệm thực tế hơn nhiều về hiệu suất lưu trữ cao hơn trên một hệ thống điển hình .

Bạn sẽ thấy một số biến động kooky trên SSD khi thực hiện bài kiểm tra này. Điều này phần lớn là do phần sụn của SSD gặp may mắn hơn hoặc kém may mắn hơn tại bất kỳ thời điểm nào, khi nó cố gắng xếp hàng các hoạt động để nó có thể viết sạch tất cả các sọc phương tiện vật lý cùng một lúc. Các đĩa Rust sẽ có xu hướng cung cấp thông lượng phù hợp hơn nhiều, mặc dù thường thấp hơn, trong suốt quá trình chạy.

Bạn cũng có thể thấy hiệu suất SSD rơi xuống một vách đá ở đây nếu bạn sử dụng hết bộ nhớ đệm ghi trên bo mạch Các ổ đĩa TLC và QLC trên bo mạch có xu hướng có các vùng bộ đệm ghi nhỏ được làm bằng phương tiện MLC hoặc SLC nhanh hơn nhiều. Khi chúng đã hết, đĩa phải chuyển sang ghi trực tiếp vào phương tiện TLC / QLC chậm hơn nhiều, nơi dữ liệu cuối cùng sẽ hạ cánh. Đây là sự khác biệt lớn giữa, ví dụ, Samsung EVO và Pro SSD SSD EVO có phương tiện TLC chậm với bộ đệm MLC nhanh, trong đó Ưu điểm sử dụng phương tiện MLC hiệu suất cao, có tuổi thọ cao hơn trong toàn bộ SSD.

Nếu bạn có bất kỳ nghi ngờ gì về khả năng duy trì khả năng ghi nặng của đĩa TLC hoặc QLC, bạn có thể muốn kéo dài thời gian thử nghiệm của mình ở đây. Nếu bạn xem thông lượng trực tiếp khi công việc tiến triển, bạn sẽ thấy tác động ngay lập tức khi bạn hết bộ nhớ cache, mức lưu lượng khá ổn định, vài trăm MiB / giây sẽ đột ngột giảm xuống một nửa tốc độ hoặc ít hơn và nhận được ít ổn định đáng kể là tốt.

Tuy nhiên, bạn có thể chọn đảm nhận vị trí đối diện, bạn có thể không mong đợi viết thường xuyên rất nặng, trong trường hợp đó bạn thực sự quan tâm nhiều hơn đến hành vi trên bộ đệm. Điều quan trọng ở đây là bạn hiểu cả những gì bạn muốn kiểm tra và làm thế nào để kiểm tra chính xác.

Kết luận

Sử dụng fio chắc chắn là một bài tập cho mọt sách thực sự (hoặc chuyên nghiệp). Nó sẽ không nắm tay bạn và mặc dù nó cung cấp kết quả cực kỳ chi tiết, nhưng chúng không tự động được tạo thành các biểu đồ đẹp cho bạn.

Nếu tất cả điều này cảm thấy quá nhiều công việc, bạn cũng có thể tìm thấy các công cụ đồ họa đơn giản hơn để sử dụng, chẳng hạn như HD Tune Pro cho Windows. HD Tune Pro có giá 35 đô la, hoặc có phiên bản phi Pro có khả năng giới hạn miễn phí cho sử dụng cá nhân. Đây là một công cụ tốt và nó sẽ tạo ra các biểu đồ sáng bóng, nhưng nó hạn chế hơn đáng kể đối với người dùng cao cấp và giá của giao diện người dùng dễ sử dụng là bạn đã bị loại bỏ khỏi thực tế kỹ thuật về những gì bạn ' đang làm

Học cách sử dụng fio có nghĩa là thực sự học tập sự khác biệt giữa ghi không đồng bộ và ghi đồng bộ và biết chắc chắn tuyệt đối những gì nó sẽ làm ở mức rất thấp trên cơ sở đối số riêng lẻ. Bạn không thể chắc chắn về những công cụ như HD Tune Pro đang thực sự hoạt động trong chương trình hood và phải xử lý các công cụ khác nhau trên các hệ điều hành khác nhau đồng nghĩa với việc so sánh trực tiếp và đối chiếu kết quả cũng khó khăn hơn.