Điểm:2

Đĩa ZFS với phân mảnh Postgresql nhanh chóng với ứng dụng nặng ghi

lá cờ in

Tôi đang chạy một ứng dụng nặng ghi nơi tôi đang lưu trữ Postgresql của mình trên ZFS.Nói chung, nó hoạt động tốt, nhưng tôi thấy rằng nhóm ZFS của mình đang bị phân mảnh nặng nề. Tôi thậm chí đã tạo một nhóm ZFS mới và di chuyển dữ liệu đến đó bằng cách sử dụng zfs send / recv, để chống phân mảnh toàn bộ không gian và thử một số cài đặt mới có thể hạn chế phân mảnh, nhưng không có kết quả.

Tôi không chắc chuyện gì đang xảy ra. Ứng dụng chủ yếu tạo CẬP NHẬT, nhưng Postgres sẽ có thể sử dụng lại không gian đã có trên đĩa (vì nó tạo các bộ dữ liệu chết và tự động hút chân không chúng, nó sẽ sử dụng lại các trang đó). Tôi thấy rằng không gian được phân bổ hầu như không thay đổi, vì vậy nó không làm tăng mức sử dụng đĩa. Tuy nhiên, bản chất COW của ZFS dường như đang làm cho hệ thống tệp sử dụng hết dung lượng trống và phân mảnh nó rất nhiều.

Vì vậy, sau khoảng 15 phút ghi nặng, phân mảnh nhóm ZFS đã tăng từ 0% (ban đầu) lên 14%. Đây không thể là cách mọi thứ được cho là:

TÊN KÍCH THƯỚC PHÂN PHỐI CKPOINT MIỄN PHÍ MỞ RỘNGZ FRAG CAP DEDUP HEALTH ALTROOT
postgres_data 149G 89,0G 60,0G - - 14% 59% 1,00x TRỰC TUYẾN -
postgres_wal 9,50G 289M 9,22G - - 0% 2% 1,00x TRỰC TUYẾN -

(lưu ý: trong thời gian tôi viết bài này, độ phân mảnh đã lên tới 16%. Có điều gì đó không đúng ở đây.)

Một số lưu ý về việc thực hiện của tôi:

  • Tôi có WAL trên một nhóm riêng biệt, theo lý thuyết rằng hằng số ghi vào WAL sẽ không phân mảnh kho lưu trữ dữ liệu chính. Rõ ràng điều này không hoạt động.
  • Tôi cũng đã cố gắng thiết lập nó với đồng bộ hóa = bị vô hiệu hóa về lý thuyết rằng ZIL đang biến đĩa của tôi thành pho mát Thụy Sĩ. Cũng không tạo ra sự khác biệt.
  • tôi hiện đang sử dụng logbias=thông lượng. Tôi đã thấy những lời khuyên mâu thuẫn nhau về điều này; tài liệu chính thức gợi ý rằng đối với postgres, người ta nên sử dụng thông lượng, trong khi một hướng dẫn rất hữu ích nói rằng "logbias=thông lượng sẽ phân mảnh mọi. Đơn. Khối. Được ghi vào nhóm của bạn." Vì vậy, trong nhóm ban đầu của tôi (hiện không còn được sử dụng nữa, vì nó bị phân mảnh tới 80%), ban đầu tôi đã sử dụng logbias=độ trễ nhưng điều đó rõ ràng cũng đã phân mảnh toàn bộ đĩa.
  • tôi đang dùng không đồng bộ = 9 bởi vì đĩa vật lý (đây là lưu trữ đám mây) có kích thước khối là 512.

Cài đặt zfs đầy đủ của tôi:

TÊN TÀI SẢN GIÁ TRỊ NGUỒN GỐC
postgres_data/hệ thống tập tin kiểu dữ liệu -
postgres_data/tạo dữ liệu Thứ ba ngày 17 tháng 5 23:36 2022 -
postgres_data/dữ liệu đã sử dụng 88,9G -
postgres_data/dữ liệu khả dụng 55,4G -
postgres_data/dữ liệu được tham chiếu 88,9G -
postgres_data/tỷ lệ nén dữ liệu 1,98x -
postgres_data/dữ liệu được gắn có -
postgres_data/hạn mức dữ liệu không có mặc định
postgres_data/đặt trước dữ liệu không có mặc định
postgres_data/data recordsize 8K kế thừa từ postgres_data
postgres_data/điểm gắn kết dữ liệu/var/lib/postgresql cục bộ
postgres_data/data sharenfs tắt mặc định
postgres_data/data checksum theo mặc định
postgres_data/nén dữ liệu zstd kế thừa từ postgres_data
postgres_data/data tạm thời tắt được kế thừa từ postgres_data
postgres_data/thiết bị dữ liệu theo mặc định
postgres_data/data exec theo mặc định
postgres_data/data setuid theo mặc định
postgres_data/dữ liệu chỉ đọc tắt mặc định
postgres_data/dữ liệu được khoanh vùng mặc định
postgres_data/data snapdir ẩn mặc định
postgres_data/data aclmode loại bỏ mặc định
postgres_data/data aclinherit hạn chế mặc định
postgres_data/dữ liệu createtxg 619 -
postgres_data/data canmount theo mặc định
postgres_data/data xattr sa kế thừa từ postgres_data
postgres_data/bản sao dữ liệu 1 mặc định
postgres_data/dữ liệu phiên bản 5 -
postgres_data/data utf8chỉ tắt -
postgres_data/chuẩn hóa dữ liệu không có -
postgres_data/dữ liệu phân biệt chữ hoa chữ thường -
postgres_data/data vscan tắt mặc định
postgres_data/data nbmand tắt mặc định
postgres_data/data sharemb tắt mặc định
postgres_data/dữ liệu giới thiệu không có mặc định
postgres_data/đặt lại dữ liệu không có mặc định
postgres_data/hướng dẫn dữ liệu 10551245409099064921 -
postgres_data/data primarycache tất cả mặc định
postgres_data/data secondarycache tất cả mặc định
postgres_data/data usedbysnapshots 0B -
postgres_data/data usedbydataset 88.9G -
postgres_data/data usedbychildren 0B -
postgres_data/data usedbyrepreservation 0B -
postgres_data/thông lượng logbias dữ liệu cục bộ
postgres_data/dữ liệu đối tượng 595 -
postgres_data/data deup tắt mặc định
postgres_data/data mlslabel không mặc định
postgres_data/đồng bộ hóa dữ liệu bị vô hiệu hóa cục bộ
postgres_data/data dnodesize mặc định kế thừa
postgres_data/tỷ lệ nén lại dữ liệu 1,98x -
postgres_data/dữ liệu được ghi 88,9G -
postgres_data/data logicused 176G -
postgres_data/dữ liệu tham chiếu logic 176G -
postgres_data/data volmode mặc định mặc định
postgres_data/data filesystem_limit không có mặc định
postgres_data/data snapshot_limit không có mặc định
postgres_data/data filesystem_count không có mặc định
postgres_data/data snapshot_count không có mặc định
postgres_data/data snapdev ẩn mặc định
postgres_data/data acltype tắt mặc định
postgres_data/bối cảnh dữ liệu không có mặc định
postgres_data/data fscontext không mặc định
postgres_data/data defcontext không có mặc định
postgres_data/data rootcontext không mặc định
postgres_data/data relatime tắt mặc định
postgres_data/data Reddred_metadata được kế thừa nhiều nhất từ ​​postgres_data
postgres_data/lớp phủ dữ liệu theo mặc định
postgres_data/mã hóa dữ liệu tắt mặc định
postgres_data/data keylocation không có mặc định
postgres_data/data keyformat không mặc định
postgres_data/dữ liệu pbkdf2iters 0 mặc định
postgres_data/data special_small_blocks 0 mặc định
Điểm:1
lá cờ ng

FRAG không có nghĩa là những gì bạn nghĩ nó làm.

Nó thể hiện mức độ phân mảnh của không gian trống của bạn. Nó không phải là một cách để cho thấy dữ liệu thực tế của bạn bị phân mảnh như thế nào.

Trong thực tế, đừng lo lắng về giá trị này trừ khi bạn thực sự chật hẹp về dung lượng hoặc gặp sự cố về hiệu suất.

Bạn nên sao lưu một số thay đổi của mình vì chúng có thể có tác động tiêu cực đến khối lượng công việc thực tế của bạn.

Kích thước bản ghi nhỏ 8k cũng góp phần vào điều này (xem xét 128k mặc định hoặc thứ gì đó lớn hơn 8k)

Nhìn thấy: https://utcc.utoronto.ca/~cks/space/blog/solaris/ZFSZpoolFragmentationMeaning

Nhìn thấy: https://bun.uptrace.dev/postgres/tuning-zfs-aws-ebs.html#zfs-recordsize

lá cờ in
Phải, tôi biết rằng đó là sự phân mảnh không gian trống. Tôi ngạc nhiên rằng nó đang tăng cao như vậy. Tôi đã gặp một số vấn đề về tốc độ trước khi cập nhật bảng chính của mình và tôi đã bị thuyết phục (có thể không chính xác?) rằng sự phân mảnh không gian trống đã góp phần vào nó. LẠI: kích thước bản ghi, nó có nghĩa là khớp với kích thước trang của PostgreSQL. Đó có phải là vấn đề không?
ewwhite avatar
lá cờ ng
Vui lòng xem các liên kết.Tôi không đề xuất giá trị kích thước bản ghi 8k ZFS cho Postgres.

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.