主从同步性能优化,主从同步性能测试。
This commit is contained in:
95
kvstore.c
95
kvstore.c
@@ -8,6 +8,7 @@
|
||||
#include "memory/alloc_dispatch.h"
|
||||
#include "common/config.h"
|
||||
#include "diskuring/diskuring.h"
|
||||
#include "replica_shm.h"
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
@@ -29,10 +30,21 @@ unsigned long long global_seq;
|
||||
|
||||
extern int global_oplog_fd;
|
||||
|
||||
replica_shm_t g_rep_shm;
|
||||
|
||||
__attribute__((noinline))
|
||||
void __completed_cmd(const uint8_t *cmd, size_t len, unsigned long long seq){
|
||||
asm volatile("" ::: "memory");
|
||||
|
||||
}
|
||||
|
||||
// __attribute__((noinline))
|
||||
// void __replica_notify(uint64_t seq, uint32_t off, uint32_t len)
|
||||
// {
|
||||
// // 空函数即可,目的是让 uprobe 拿到参数
|
||||
// asm volatile("" ::: "memory");
|
||||
// }
|
||||
|
||||
int kvs_protocol(struct conn* conn){
|
||||
if (!conn) return -1;
|
||||
char *request = conn->rbuffer;
|
||||
@@ -68,10 +80,6 @@ int kvs_protocol(struct conn* conn){
|
||||
|
||||
int dr = resp_dispatch(&cmd, &val);
|
||||
|
||||
__completed_cmd(p, len, global_seq);
|
||||
global_seq ++;
|
||||
|
||||
|
||||
/*
|
||||
* 语义建议:
|
||||
* - resp_dispatch() 即使返回 -1(比如 unknown command / wrong argc),
|
||||
@@ -88,29 +96,45 @@ int kvs_protocol(struct conn* conn){
|
||||
}
|
||||
} else {
|
||||
// persist into oplog
|
||||
if(global_cfg.persistence == PERSIST_INCREMENTAL){
|
||||
|
||||
/* 执行成功:在这里保存到日志中(只记录更新类命令) */
|
||||
if (cmd.argc > 0 && cmd.argv[0].ptr) {
|
||||
/* 更新类命令:SET/DEL/MOD/RSET/RDEL/RMOD/HSET/HDEL/HMOD/SAVE */
|
||||
const resp_slice_t *c0 = &cmd.argv[0];
|
||||
int is_update = 0;
|
||||
if (c0->ptr && c0->len) {
|
||||
if (ascii_casecmp(c0->ptr, c0->len, "SET") == 0 ||
|
||||
ascii_casecmp(c0->ptr, c0->len, "DEL") == 0 ||
|
||||
ascii_casecmp(c0->ptr, c0->len, "MOD") == 0 ||
|
||||
ascii_casecmp(c0->ptr, c0->len, "RSET") == 0 ||
|
||||
ascii_casecmp(c0->ptr, c0->len, "RDEL") == 0 ||
|
||||
ascii_casecmp(c0->ptr, c0->len, "RMOD") == 0 ||
|
||||
ascii_casecmp(c0->ptr, c0->len, "HSET") == 0 ||
|
||||
ascii_casecmp(c0->ptr, c0->len, "HDEL") == 0 ||
|
||||
ascii_casecmp(c0->ptr, c0->len, "HMOD") == 0) {
|
||||
is_update = 1;
|
||||
}
|
||||
/* 执行成功:在这里保存到日志中(只记录更新类命令) */
|
||||
if (cmd.argc > 0 && cmd.argv[0].ptr) {
|
||||
/* 更新类命令:SET/DEL/MOD/RSET/RDEL/RMOD/HSET/HDEL/HMOD/SAVE */
|
||||
const resp_slice_t *c0 = &cmd.argv[0];
|
||||
int is_update = 0;
|
||||
if (c0->ptr && c0->len) {
|
||||
if (ascii_casecmp(c0->ptr, c0->len, "SET") == 0 ||
|
||||
ascii_casecmp(c0->ptr, c0->len, "DEL") == 0 ||
|
||||
ascii_casecmp(c0->ptr, c0->len, "MOD") == 0 ||
|
||||
ascii_casecmp(c0->ptr, c0->len, "RSET") == 0 ||
|
||||
ascii_casecmp(c0->ptr, c0->len, "RDEL") == 0 ||
|
||||
ascii_casecmp(c0->ptr, c0->len, "RMOD") == 0 ||
|
||||
ascii_casecmp(c0->ptr, c0->len, "HSET") == 0 ||
|
||||
ascii_casecmp(c0->ptr, c0->len, "HDEL") == 0 ||
|
||||
ascii_casecmp(c0->ptr, c0->len, "HMOD") == 0) {
|
||||
is_update = 1;
|
||||
}
|
||||
}
|
||||
|
||||
if (is_update) {
|
||||
if (is_update) {
|
||||
if(global_cfg.persistence == PERSIST_INCREMENTAL){
|
||||
kvs_oplog_append(p, len, global_oplog_fd);
|
||||
}
|
||||
|
||||
// __completed_cmd(p, len, global_seq);
|
||||
// global_seq ++;
|
||||
|
||||
if (global_cfg.replica_mode == REPLICA_ENABLE) {
|
||||
uint32_t off = 0;
|
||||
int ar = replica_shm_append(&g_rep_shm, global_seq, p, (uint32_t)len, &off);
|
||||
if (ar == 0) {
|
||||
// __replica_notify(global_seq, off, (uint32_t)len);
|
||||
global_seq++;
|
||||
|
||||
} else {
|
||||
// shm 满或异常:你可以选择降级(比如直接跳过复制,或阻塞/丢弃)
|
||||
// 为了不影响主路径,这里先打印并跳过
|
||||
fprintf(stderr, "replica_shm_append failed %d\n", ar);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -245,7 +269,8 @@ int init_config(AppConfig *cfg){
|
||||
printf("=============== Config ===============\n");
|
||||
printf("IP : %s\n", cfg->ip);
|
||||
printf("Port : %d\n", cfg->port);
|
||||
|
||||
|
||||
printf("Replica-Mode : %s\n", replica_to_string(cfg->replica_mode));
|
||||
printf("Mode : %s\n", server_mode_to_string(cfg->mode));
|
||||
printf("|—— Master IP : %s\n", cfg->master_ip);
|
||||
printf("|—— Master Port : %d\n", cfg->master_port);
|
||||
@@ -268,7 +293,24 @@ int init_config(AppConfig *cfg){
|
||||
}
|
||||
|
||||
void init_disk_uring(iouring_ctx_t *uring_ctx){
|
||||
iouring_init(uring_ctx, 2048);
|
||||
// iouring_init(uring_ctx, 4096);
|
||||
iouring_init(uring_ctx, (1024*8));
|
||||
}
|
||||
|
||||
void dest_disk_uring(iouring_ctx_t *uring_ctx){
|
||||
iouring_shutdown(uring_ctx);
|
||||
}
|
||||
|
||||
int kvs_replica_init(void)
|
||||
{
|
||||
if (global_cfg.replica_mode == REPLICA_ENABLE) {
|
||||
int rc = replica_shm_open(&g_rep_shm, REPLICA_SHM_NAME, REPLICA_SHM_SIZE, /*create=*/ 1);
|
||||
if (rc != 0) {
|
||||
fprintf(stderr, "replica_shm_open failed rc=%d\n", rc);
|
||||
return rc;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -279,6 +321,7 @@ int main(int argc, char *argv[]) {
|
||||
}
|
||||
global_seq = 0;
|
||||
|
||||
kvs_replica_init();
|
||||
init_memory_pool(&global_cfg);
|
||||
init_data_file(&global_cfg);
|
||||
init_disk_uring(&global_uring_ctx);
|
||||
|
||||
Reference in New Issue
Block a user