/*多线程多实例,注意线程的绑定,一个core绑定一个sq线程,一个或者多个core绑定一个或多个work线程,还有控制worker线程个数,还有numa的绑定
编译命令: gcc -g -o iouring www_iouring.c -L/usr/lib -luring
执行命令: numactl --cpunodebind=1 --membind=1 ./iouring io_uring.conf
*/
#define _GNU_SOURCE//使用sched.h的时候需要添加GNU宏
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define MAX_LINE_LENGTH 256
#define MAX_FILENAME_COUNT 52
#define IOWQ_CPU 0
#define OBJ_NUM 1
#define CPU_CORE 2
//Parameters in the configuration file
typedef struct {
int sqthread_poll;
int direct;
int time_based;
int group_reporting;
int iodepth;
int numjobs;
int runtime;
int ramp_time;
int rwmixread;
int sqthread_cpu;
char rw[50];
int bs;
} global_config;
typedef struct {
char filename[MAX_FILENAME_COUNT][MAX_LINE_LENGTH];
int filename_count;
}job_config;
off_t getFileSize(int fd) {
off_t offset = lseek(fd, 0, SEEK_CUR);
return offset;
}
//Read configuration file
void read_config(const char *filename, global_config *global, job_config *job) {
FILE *file = fopen(filename, "r");
if (!file) {
perror("Error opening config file");
exit(EXIT_FAILURE);
}
char line[MAX_LINE_LENGTH];
char section[MAX_LINE_LENGTH] = "";
job->filename_count = 0; // Initialize filename count
while (fgets(line, sizeof(line), file)) {
// Remove trailing newline character
line[strcspn(line, "\n")] = '\0';
// Ignore empty lines and comments
if (line[0] == '\0' || line[0] == '#') {
continue;
}
// If it's a section title, update the current section name
if (line[0] == '[' && line[strlen(line) - 1] == ']') {
sscanf(line, "[%[^]]", section);
continue;
}
// Parse key-value pairs
char key[MAX_LINE_LENGTH];
char value[MAX_LINE_LENGTH];
sscanf(line, "%[^=]=%s", key, value);
// Store parameter values in the appropriate structure based on the current section name
if (strcmp(section, "global") == 0) {
// Global section parameters
if (strcmp(key, "sqthread_poll") == 0) {
global->sqthread_poll = atoi(value);
} else if (strcmp(key, "direct") == 0) {
global->direct = atoi(value);
} else if (strcmp(key, "time_based") == 0) {