ZFS tuning in proxomox for small business

Hi,

I am currently performing some test of a newly built server for a small business ( Radiology center).
The system is a follows :

  • Ryzen 7950x
  • Asus Pro Art X670E
  • HBA : broadcom 9400 16I
  • Storage : * 4 SAS SSD Samsung PM1643a 1.92 TB +1 Cold
    * 4 SAS SSD Samsung PM1643a 960 GB +1 Cold
    * 4 Ironwolf Pro 10 TB + 1 Cold
    * 2 Kingstone DC600 SATA SSD 480 + 1 Cold

Use Case :

The business uses mainly two softwares :

  • PACS ( Picture archiving and communication system) which centralizes all the image from the different machines in DICOM format ( More on that later)
  • RIS ( Radiological information system) which recordes patient informations and report on the exams.

Both software relies on SQL databases to run ( separate) and run only on windows.
The PACS receives and store the images in dicom format which splits the images into small files
The RIS software relies heavily on the SQL database ( 400 GB at the time of writing) but does not generate any addtionnal files to be stored.

This system will be entirely backed up in the current server the center is using ( probably with PBS) ( Dell T340 poweredge)

ZFS layout

I am planning to use proxmox with 2 windows VMs ( Windows Server 2022 ) one for pacs and one for ris.
The ZFS layout I have chosen is the following :

  • 4 SAS SSD Samsung PM1643a 1.92 TB Setup in a raid 10 mirror for short term storage of the images ( up to 1 year worth of data) => 1 Zvol specifically dedicated
  • 4 Ironwolf Pro 10 TB setup in raidZ1 configuration for long term storage of the the images => 1 Zvol specifically dedicated
  • 4 SAS SSD Samsung PM1643a 960 GB Setup in a raid 10 mirror for storing the VMs and databases. => 1 ZVOL partionned in windows later

I have analyzed the PACS images of the current year using wintree and came up with the following data on the sizes

Size of the file In KB Number of files Percentage
515 4 657 872 30,8%
8 4 315 601 28,6%
42 2 156 243 14,3%
45 1 058 961 7,0%
41 1 017 747 6,7%
9 234 616 1,6%
44 230 710 1,5%
7 119 470 0,8%
Rest ( Multiple other sizes from 7KB to 2000 KB) 1 323 351 8,8%

Considering the data i provided , what do you guys advise me on the the zfs parameters (ashift…) and zvol block size i should use for each pool and the block size in the windows VMs
For the VM/dababase pool, I read that the blocksize of the pool should match the record size of the database but i cannot find the recordsize of my databases on MSSQL. If you have any idea how to get this information, that would be very helpful. Do you think i should make separate Zvol ? ( 1 For VMs and 1 for Databases ? )
For the HDD pool, I have not added any caching to it as this pool will be accessed only once or twice per year to move data from the Short term pool and occasionnaly for read access but I would like to be able to search for files easily in this pool and i tought a special metadata vdev would be a good idea

The server is not yet deployed and I can completely reconfigured right now, if you find have any advice on the way my pools are set up, I would love to hear it.

Thank you in advance for you help

1 Like

Hi,

For the PACS image storage, consider using a 64K block size, given the predominance of small files. For the RIS database, aim for a block size of 8K to match typical MSSQL page sizes. To determine the exact record size for your MSSQL databases, you can run the DBCC SHOWCONTIG command in SQL Server.

Thanks

Hi,

Thank you so much for you input, I was able to extract the record size of the database of the PACs using the following command :
DBCC SHOWCONTIG WITH TABLES.
It gave the following results :

Objectname Objectid Index Name IndexId Level Pages Rows MinimumRecordsize MaximumRecordSize AverageRecordSize
log_table 1394104007 0 0 908769 48549639 130 209 143,02
image 254623950 PK__image 1 0 2475249 26117386 429 795 642,97
image_orientation 1298103665 PK__image_or__6F1D08D54F47C5E3 1 0 2333823 25018920 560 740 641,18
image_position 818101955 PK__image_po__6F1D08D532AB8735 1 0 838309 25011800 182 258 219,29
serie 523148909 PK__serie 1 0 8148 346789 118 231 151,48
examen 923150334 examen_pk 1 0 23269 228528 616 846 686,90
monitoring_reseau_test_unit 1522104463 PK__monitori__BD5B9E385CA1C101 1 0 4840 207001 133 168 151,70
images_a_copier 1634104862 0 0 14964 170129 488 685 602,56
patient 2011154210 patient_id_pk 1 0 2562 149676 78 146 109,68
annot_table 805577908 0 0 3812 112722 202 468 257,32
compresse_to_web_or_std 1826105546 0 0 2333 35939 264 363 280,52
hq2standard 1838629593 PK__hq2standard 1 0 1510 33456 219 305 267,62
miniature 1918629878 PK__miniature 1 0 743 22194 131 284 217,92
monitoring_reseau 1410104064 PK__monitori__EF47A49655F4C372 1 0 317 17250 110 120 118,06
sessionWeb 421576540 PK__sessionW__A75F87CC1B0907CE 1 0 134 7692 87 100 92,89
printlist 123147484 0 0 278 786 170 275 235,15
I am not sure how to interpret these results, are the recordsize column displayed in KB ? if yes, i was expecting a multiple of 8KB. My understanding is the maximum size per page in MSSQL is 8KB. Please can you help understand these results as I have very little knowledge of SQL.
For the IMAGE zpool, isnt a 64KB Vblocksize a litlle to high since I have almost 29% of the files sized a 8 KB ?

Thank you for your help