优化io_uring的热点代码
This commit is contained in:
@@ -37,21 +37,17 @@ struct iobuffer_pool
|
|||||||
struct iobuffer *free_list;
|
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
|
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 sockfd;
|
||||||
int eventfd;
|
int eventfd;
|
||||||
|
|
||||||
struct config config;
|
|
||||||
struct io_uring ring;
|
struct io_uring ring;
|
||||||
struct io_uring_params params;
|
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->sockfd = sockfd;
|
||||||
instance->eventfd = eventfd;
|
instance->eventfd = eventfd;
|
||||||
instance->config.ring_size = ring_size;
|
instance->cfg_ring_size = ring_size;
|
||||||
instance->config.buff_size = buff_size;
|
instance->cfg_buff_size = buff_size;
|
||||||
instance->config.flags = flags;
|
instance->cfg_flags = flags;
|
||||||
instance->config.sq_thread_idle = sq_thread_idle;
|
instance->cfg_sq_thread_idle = sq_thread_idle;
|
||||||
instance->config.enable_debug = enable_debug;
|
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)
|
if (instance->pool == NULL)
|
||||||
{
|
{
|
||||||
TFE_LOG_ERROR(g_default_logger, "IO_URING: unable to create io buffer pool, %s", strerror(errno));
|
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:
|
* 执行下面命令进行验证 IORING_SETUP_SQPOLL:
|
||||||
* sudo bpftrace -e 'tracepoint:io_uring:io_uring_submit_sqe {printf("%s(%d)\n", comm, pid);}'
|
* 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);
|
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_prep_readv(sqe, instance->sockfd, &buffer->vec, 1, 0);
|
||||||
io_uring_sqe_set_data(sqe, buffer);
|
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",
|
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);
|
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;
|
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;
|
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_prep_writev(sqe, instance->sockfd, &buffer->vec, 1, 0);
|
||||||
io_uring_sqe_set_data(sqe, buffer);
|
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",
|
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);
|
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 io_uring *ring = &instance->ring;
|
||||||
struct iobuffer_pool *pool = instance->pool;
|
struct iobuffer_pool *pool = instance->pool;
|
||||||
io_uring_read_cb *read_cb = instance->read_cb;
|
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)
|
while (1)
|
||||||
{
|
{
|
||||||
@@ -501,7 +497,7 @@ int io_uring_polling(struct io_uring_instance *instance)
|
|||||||
}
|
}
|
||||||
|
|
||||||
buffer = (struct iobuffer *)cqe->user_data;
|
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",
|
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);
|
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