优化io_uring的热点代码
This commit is contained in:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user