diff options
author | mav <mav@FreeBSD.org> | 2015-04-21 10:55:53 +0000 |
---|---|---|
committer | mav <mav@FreeBSD.org> | 2015-04-21 10:55:53 +0000 |
commit | 1c8b5426f3f10c739d5a27e6db5e0a9f247224e8 (patch) | |
tree | d021fc0e68d8917c9df12915eb55409b54cf0c8c /lib/libc | |
parent | 5afcf58994ede12fc23de9cefbacf93de140bcf5 (diff) | |
download | FreeBSD-src-1c8b5426f3f10c739d5a27e6db5e0a9f247224e8.zip FreeBSD-src-1c8b5426f3f10c739d5a27e6db5e0a9f247224e8.tar.gz |
Rewrite physio() to not allocate pbufs for unmapped I/O.
pbufs is a limited resource, and their allocator is not SMP-scalable.
So instead of always allocating pbuf to immediately convert it to bio,
allocate bio just here. If buffer needs kernel mapping, then pbuf is
still allocated, but used only as a source of KVA and storage for a list
of held pages.
On 40-core system doing many 512-byte reads from user level to array of
raw SSDs this change removes huge lock congestion inside pbuf allocator.
It improves peak performance from ~300K to ~1.2M IOPS. On my previous
24-core system this problem also existed, but was less serious.
Reviewed by: kib
MFC after: 2 weeks
Diffstat (limited to 'lib/libc')
0 files changed, 0 insertions, 0 deletions