Remove use of mmap for random reads
Summary: Reads via mmap on concurrent workloads are much slower than pread. For example on a 24-core server with storage that can do 100k IOPS or more I can get no more than 10k IOPS with mmap reads and 32+ threads. Test Plan: db_bench benchmarks Reviewers: dhruba, heyongqiang Reviewed By: heyongqiang Differential Revision: https://reviews.facebook.net/D5433
This commit is contained in:
parent
fa29f82548
commit
33323f2111
@ -386,24 +386,13 @@ class PosixEnv : public Env {
|
|||||||
|
|
||||||
virtual Status NewRandomAccessFile(const std::string& fname,
|
virtual Status NewRandomAccessFile(const std::string& fname,
|
||||||
RandomAccessFile** result) {
|
RandomAccessFile** result) {
|
||||||
|
// Use of mmap for random reads has been removed because it
|
||||||
|
// kills performance when storage is fast.
|
||||||
*result = NULL;
|
*result = NULL;
|
||||||
Status s;
|
Status s;
|
||||||
int fd = open(fname.c_str(), O_RDONLY);
|
int fd = open(fname.c_str(), O_RDONLY);
|
||||||
if (fd < 0) {
|
if (fd < 0) {
|
||||||
s = IOError(fname, errno);
|
s = IOError(fname, errno);
|
||||||
} else if (useOsBuffer && sizeof(void*) >= 8) {
|
|
||||||
// Use mmap when virtual address-space is plentiful.
|
|
||||||
uint64_t size;
|
|
||||||
s = GetFileSize(fname, &size);
|
|
||||||
if (s.ok()) {
|
|
||||||
void* base = mmap(NULL, size, PROT_READ, MAP_SHARED, fd, 0);
|
|
||||||
if (base != MAP_FAILED) {
|
|
||||||
*result = new PosixMmapReadableFile(fname, base, size);
|
|
||||||
} else {
|
|
||||||
s = IOError(fname, errno);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
close(fd);
|
|
||||||
} else {
|
} else {
|
||||||
*result = new PosixRandomAccessFile(fname, fd);
|
*result = new PosixRandomAccessFile(fname, fd);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user