> The first thing that comes to mind for me is fsync working correctly (i.e.
> actually waiting for the disk write) in Linux but not in Windows.
> On a weird VM stack like you've got, it's not hard for that sort of thing to
> go
> wrong. Needless to say, if that's the issue then the apparent performance
> win is coming at the cost of crash safety.
>
> pg_test_fsync might help detect such a problem.
>
> regards, tom lane
>
fsync performance on win is much better (results are below). Also network
performance for VMs on same HV for win-win is 40% better than for win-linux
(5,97Gbps vs 3,6Gbps).
Regarding weird VM stack - we're running both win and linux VMs and Hyper-V
works reasonable well except... this issue )
Win:
C:\Program Files\PostgreSQL\12.6-6.1C\bin>pg_test_fsync.exe
5 seconds per test
O_DIRECT supported on this platform for open_datasync and open_sync.
Compare file sync methods using one 8kB write:
(in wal_sync_method preference order, except fdatasync is Linux's default)
open_datasync 7423,645 ops/sec 135 usecs/op
fdatasync n/a
fsync 1910,611 ops/sec 523 usecs/op
fsync_writethrough 1987,900 ops/sec 503 usecs/op
open_sync n/a
Compare file sync methods using two 8kB writes:
(in wal_sync_method preference order, except fdatasync is Linux's default)
open_datasync 3827,254 ops/sec 261 usecs/op
fdatasync n/a
fsync 1920,720 ops/sec 521 usecs/op
fsync_writethrough 1863,852 ops/sec 537 usecs/op
open_sync n/a
Compare open_sync with different write sizes:
(This is designed to compare the cost of writing 16kB in different write
open_sync sizes.)
1 * 16kB open_sync write n/a
2 * 8kB open_sync writes n/a
4 * 4kB open_sync writes n/a
8 * 2kB open_sync writes n/a
16 * 1kB open_sync writes n/a
Test if fsync on non-write file descriptor is honored:
(If the times are similar, fsync() can sync data written on a different
descriptor.)
write, fsync, close 144,065 ops/sec 6941 usecs/op
write, close, fsync 148,751 ops/sec 6723 usecs/op
Non-sync'ed 8kB writes:
write 165,484 ops/sec 6043 usecs/op
Linux:
[root@pgsql12 ~]# /usr/pgsql-12/bin/pg_test_fsync
5 seconds per test
O_DIRECT supported on this platform for open_datasync and open_sync.
Compare file sync methods using one 8kB write:
(in wal_sync_method preference order, except fdatasync is Linux's default)
open_datasync 2947.296 ops/sec 339 usecs/op
fdatasync 2824.271 ops/sec 354 usecs/op
fsync 1885.924 ops/sec 530 usecs/op
fsync_writethrough n/a
open_sync 1816.312 ops/sec 551 usecs/op
Compare file sync methods using two 8kB writes:
(in wal_sync_method preference order, except fdatasync is Linux's default)
open_datasync 1458.849 ops/sec 685 usecs/op
fdatasync 2712.756 ops/sec 369 usecs/op
fsync 1769.353 ops/sec 565 usecs/op
fsync_writethrough n/a
open_sync 902.626 ops/sec 1108 usecs/op
Compare open_sync with different write sizes:
(This is designed to compare the cost of writing 16kB in different write
open_sync sizes.)
1 * 16kB open_sync write 1798.811 ops/sec 556 usecs/op
2 * 8kB open_sync writes 887.727 ops/sec 1126 usecs/op
4 * 4kB open_sync writes 494.843 ops/sec 2021 usecs/op
8 * 2kB open_sync writes 233.659 ops/sec 4280 usecs/op
16 * 1kB open_sync writes 117.417 ops/sec 8517 usecs/op
Test if fsync on non-write file descriptor is honored:
(If the times are similar, fsync() can sync data written on a different
descriptor.)
write, fsync, close 1673.781 ops/sec 597 usecs/op
write, close, fsync 1727.787 ops/sec 579 usecs/op
Non-sync'ed 8kB writes:
write 200638.271 ops/sec 5 usecs/op
--
Taras