Indeed this looks like a set up that should definitely work. Could you please run iostat like this, including all devices relevant for your storage stack (drive itself, any LVM/LUKS/whatever intermediate layers if you have any) and collect IOPS data?
This is normal. Consider that out of 110 connections that an uploader opens, only 80 finish, so 30/110 ≈ 27% is cancelled simply because your node might have been too far from the uploader, or there was a bottleneck between them and your node. 20% looks like better than average.
Speaking as a node operator, this is indeed a bit silly.