优化io_uring的热点代码

This commit is contained in:
luwenpeng
2023-12-27 15:23:24 +08:00
parent ced991b4a0
commit 9355ec33d1

View File

@@ -37,21 +37,17 @@ struct iobuffer_pool
struct iobuffer *free_list;
};
struct config
{
int ring_size;
int buff_size;
int flags;
int sq_thread_idle; // milliseconds
int enable_debug;
};
struct io_uring_instance
{
int cfg_ring_size;
int cfg_buff_size;
int cfg_flags;
int cfg_sq_thread_idle; // milliseconds
int cfg_enable_debug;
int sockfd;
int eventfd;
struct config config;
struct io_uring ring;
struct io_uring_params params;
@@ -309,13 +305,13 @@ struct io_uring_instance *io_uring_instance_create(int sockfd, int eventfd, int
instance->sockfd = sockfd;
instance->eventfd = eventfd;
instance->config.ring_size = ring_size;
instance->config.buff_size = buff_size;
instance->config.flags = flags;
instance->config.sq_thread_idle = sq_thread_idle;
instance->config.enable_debug = enable_debug;
instance->cfg_ring_size = ring_size;
instance->cfg_buff_size = buff_size;
instance->cfg_flags = flags;
instance->cfg_sq_thread_idle = sq_thread_idle;
instance->cfg_enable_debug = enable_debug;
instance->pool = iobuffer_pool_create(instance->config.buff_size, instance->config.ring_size);
instance->pool = iobuffer_pool_create(instance->cfg_buff_size, instance->cfg_ring_size);
if (instance->pool == NULL)
{
TFE_LOG_ERROR(g_default_logger, "IO_URING: unable to create io buffer pool, %s", strerror(errno));
@@ -328,14 +324,14 @@ struct io_uring_instance *io_uring_instance_create(int sockfd, int eventfd, int
* 执行下面命令进行验证 IORING_SETUP_SQPOLL:
* sudo bpftrace -e 'tracepoint:io_uring:io_uring_submit_sqe {printf("%s(%d)\n", comm, pid);}'
*/
if (instance->config.flags)
if (instance->cfg_flags)
{
instance->params.flags |= instance->config.flags;
instance->params.flags |= instance->cfg_flags;
}
if (instance->config.sq_thread_idle)
if (instance->cfg_sq_thread_idle)
{
instance->params.sq_thread_idle = instance->config.sq_thread_idle; // milliseconds
instance->params.sq_thread_idle = instance->cfg_sq_thread_idle; // milliseconds
}
ret = io_uring_queue_init_params(ring_size, &instance->ring, &instance->params);
@@ -388,7 +384,7 @@ static int io_uring_read(struct io_uring_instance *instance, struct iobuffer *bu
io_uring_prep_readv(sqe, instance->sockfd, &buffer->vec, 1, 0);
io_uring_sqe_set_data(sqe, buffer);
if (instance->config.enable_debug)
if (unlikely(instance->cfg_enable_debug))
{
TFE_LOG_DEBUG(g_default_logger, "IO_URING: submit read entry: sockfd: %02d sqe: %p user_data: %p iov_base: %p iovec_len: %04ld",
instance->sockfd, sqe, (void *)sqe->user_data, buffer->vec.iov_base, buffer->vec.iov_len);
@@ -409,9 +405,9 @@ int io_uring_write(struct io_uring_instance *instance, const char *data, int len
return -1;
}
if (len > instance->config.buff_size)
if (len > instance->cfg_buff_size)
{
TFE_LOG_ERROR(g_default_logger, "IO_URING: the length of the sent data [%d] is greater than the capacity of the io_uring buffer [%d]", len, instance->config.buff_size);
TFE_LOG_ERROR(g_default_logger, "IO_URING: the length of the sent data [%d] is greater than the capacity of the io_uring buffer [%d]", len, instance->cfg_buff_size);
return -1;
}
@@ -428,7 +424,7 @@ int io_uring_write(struct io_uring_instance *instance, const char *data, int len
io_uring_prep_writev(sqe, instance->sockfd, &buffer->vec, 1, 0);
io_uring_sqe_set_data(sqe, buffer);
if (instance->config.enable_debug)
if (unlikely(instance->cfg_enable_debug))
{
TFE_LOG_DEBUG(g_default_logger, "IO_URING: submit write entry: sockfd: %02d sqe: %p user_data: %p iov_base: %p iovec_len: %04ld",
instance->sockfd, sqe, (void *)sqe->user_data, buffer->vec.iov_base, buffer->vec.iov_len);
@@ -480,7 +476,7 @@ int io_uring_polling(struct io_uring_instance *instance)
struct io_uring *ring = &instance->ring;
struct iobuffer_pool *pool = instance->pool;
io_uring_read_cb *read_cb = instance->read_cb;
int enable_debug = instance->config.enable_debug;
int enable_debug = instance->cfg_enable_debug;
while (1)
{
@@ -501,7 +497,7 @@ int io_uring_polling(struct io_uring_instance *instance)
}
buffer = (struct iobuffer *)cqe->user_data;
if (enable_debug)
if (unlikely(enable_debug))
{
TFE_LOG_DEBUG(g_default_logger, "IO_URING: handle %s entry: sockfd: %02d cqe: %p user_data: %p iov_base: %p iovec_len: %04ld cqe->res: %04d",
ioevent_tostring(buffer->event), instance->sockfd, cqe, (void *)buffer, buffer->vec.iov_base, buffer->vec.iov_len, cqe->res);