gpt4 book ai didi

c++ - 具有 libaio 性能问题的 Linux 异步 IO

转载 作者:IT王子 更新时间:2023-10-29 01:18:31 28 4
gpt4 key购买 nike

我正在尝试使用 Linux libaio 来优化服务器应用程序中的 IO 性能。我相信我已经完成了所有必要的事情(使用 O_DIRECT,将缓冲区与内存页对齐...)。我期待对 io_submit 的调用立即返回,但一个简单的测试表明它实际上需要大约 80 微秒才能在我的核心 i7 笔记本电脑上返回。是我期望过高还是我的测试程序有问题? (用 g++ --std=c++0x -laio 编译)

#include <unistd.h>
#include <fcntl.h>
#include <libaio.h>
#include <errno.h>
#include <cstdlib>
#include <cstdio>
#include <iostream>
#include <chrono>

// Open the file for write, return the file descriptor
int open_write(char const* file)
{
int fd = open(file, O_DIRECT|O_CREAT|O_WRONLY, S_IRWXU|S_IRWXG|S_IROTH);
if (fd < 0) {
perror("open_write");
exit(1);
}
}

// Make a buffer of _size_ byte, fill with 'a', return the buffer, it should be aligned to memory page
void* make_write_buffer(size_t size)
{
void* buf = 0;
int ret = posix_memalign((void**)&buf, sysconf(_SC_PAGESIZE), size);
if (ret < 0 || buf == 0) {
perror("make_write_buffer");
exit(1);
}
memset(buf, 'a', size);
return buf;
}

int main (int argc, char *argv[])
{
static const size_t SIZE = 16 * 1024;

// Prepare file and buffer to write
int write_fd = open_write("test.dat");
void* buf = make_write_buffer(SIZE);

// Prepare aio
io_context_t ctx;
memset(&ctx, 0, sizeof(ctx));
const int maxEvents = 32;
io_setup(maxEvents, &ctx);

iocb *iocbpp = new iocb;
io_prep_pwrite(iocbpp, write_fd, buf, SIZE, 0);

using namespace std::chrono;
// Submit aio task
auto start = monotonic_clock::now();
int status = io_submit(ctx, 1, &iocbpp);
if (status < 0) {
errno = -status;
perror("io_submit");
exit(1);
}
auto dur = duration_cast<microseconds>(monotonic_clock::now() - start);
std::cout << "io_submit takes: " << dur.count() << " microseconds." << std::endl;

io_event events[10];
int n = io_getevents(ctx, 1, 10, events, NULL);

close(write_fd);
io_destroy(ctx);
delete iocbpp;
free(buf);
return 0;
}

最佳答案

简而言之:io_submit block ,除了修复内核之外,您无能为力。

Here's a "blocking io_submit" thread from 2011-09-23在 linux-aio 邮件列表上。

正如该线程中所指出的,您可以尝试增加 /sys/block/xxx/queue/nr_requests

关于c++ - 具有 libaio 性能问题的 Linux 异步 IO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8629690/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com