From 7f609a1959b6489fdcbd26c3928611afcff4d134 Mon Sep 17 00:00:00 2001 From: Avi Kivity Date: Sun, 24 Aug 2014 10:30:54 +0300 Subject: [PATCH] fileiotest: limit concurrency Otherwise, all of the writes are submitted at once, consuming tons of memory, and preventing reads from happening in parallel to writes. Add a semaphore to limit the amount of parallel I/O. --- fileiotest.cc | 32 ++++++++++++++++++-------------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/fileiotest.cc b/fileiotest.cc index 5f8c4fae77..e8ffc28773 100644 --- a/fileiotest.cc +++ b/fileiotest.cc @@ -9,26 +9,30 @@ struct file_test { file_test(file&& f) : f(std::move(f)) {} file f; semaphore sem = { 0 }; + semaphore par = { 1000 }; }; int main(int ac, char** av) { static constexpr auto max = 10000; the_reactor.open_file_dma("testfile.tmp").then([] (file f) { auto ft = new file_test{std::move(f)}; - for (size_t i = 0; i < 10000; ++i) { - auto wbuf = allocate_aligned_buffer(4096, 4096); - std::fill(wbuf.get(), wbuf.get() + 4096, i); - auto wb = wbuf.get(); - ft->f.dma_write(i * 4096, wb, 4096).then( - [ft, i, wbuf = std::move(wbuf)] (size_t ret) mutable { - assert(ret == 4096); - auto rbuf = allocate_aligned_buffer(4096, 4096); - auto rb = rbuf.get(); - ft->f.dma_read(i * 4096, rb, 4096).then( - [ft, i, rbuf = std::move(rbuf), wbuf = std::move(wbuf)] (size_t) mutable { - bool eq = std::equal(rbuf.get(), rbuf.get() + 4096, wbuf.get()); - assert(eq); - ft->sem.signal(1); + for (size_t i = 0; i < max; ++i) { + ft->par.wait().then([ft, i] { + auto wbuf = allocate_aligned_buffer(4096, 4096); + std::fill(wbuf.get(), wbuf.get() + 4096, i); + auto wb = wbuf.get(); + ft->f.dma_write(i * 4096, wb, 4096).then( + [ft, i, wbuf = std::move(wbuf)] (size_t ret) mutable { + assert(ret == 4096); + auto rbuf = allocate_aligned_buffer(4096, 4096); + auto rb = rbuf.get(); + ft->f.dma_read(i * 4096, rb, 4096).then( + [ft, i, rbuf = std::move(rbuf), wbuf = std::move(wbuf)] (size_t) mutable { + bool eq = std::equal(rbuf.get(), rbuf.get() + 4096, wbuf.get()); + assert(eq); + ft->sem.signal(1); + ft->par.signal(); + }); }); }); }