在Linux下给Kingbase8“开小灶”,核心是榨干硬件潜力。除了改数据库参数,必须动系统内核。针对你之前关注的查询优化,以下配置能直接降低I/O延迟和内存管理开销。
1. 内核参数调优(/etc/sysctl.conf)
核心逻辑:扩大共享内存池、减少内存交换、提升网络吞吐。
# 共享内存(Kingbase重度依赖,必须调大)
kernel.shmall = 4294967296 # 总共享内存页数,通常设物理内存的80%
kernel.shmmax = 68719476736 # 单个共享内存段最大字节(64GB)
kernel.shmmni = 4096 # 共享内存段最大数量
# 内存与交换
vm.swappiness = 1 # 极度厌恶换出,除非内存爆满(防OOM)
vm.dirty_ratio = 10 # 系统脏页占比阈值,写密集型可调高
vm.dirty_background_ratio = 5 # 后台刷脏阈值
# 网络(高并发连接必备)
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 16384 16777216
net.ipv4.tcp_max_syn_backlog = 4096
net.ipv4.tcp_keepalive_time = 300
生效:
"sysctl -p"
2. 磁盘I/O“手术”(SSD vs HDD)
目标:减少寻道和调度延迟。这是解决“查询慢”最直接的系统手段。
硬件类型 调度算法 预读大小 队列深度
SSD(主流)
"noop" 或
"none" 16-32 KB 256-512
HDD(机械)
"deadline" 256-512 KB 64-128
操作命令(以SSD
"/dev/sdb"为例):
# 临时生效
echo noop > /sys/block/sdb/queue/scheduler
echo 16 > /sys/block/sdb/queue/read_ahead_kb
echo 512 > /sys/block/sdb/queue/nr_requests
# 永久生效(写入 /etc/rc.local 或 udev规则)
3. 文件系统挂载(XFS首选)
挂载参数:
"defaults,noatime,nodiratime,nobarrier"
-
"noatime":必加。禁止更新文件访问时间,消除大量元数据写操作(对SELECT查询性能提升显著)。
-
"nobarrier":仅限有电池保护的RAID卡或企业级SSD,否则有数据损坏风险。
示例(/etc/fstab):
/dev/sdb1 /kingbase_data xfs defaults,noatime,nodiratime 0 0
4. 大页内存(HugePages)配置
适用场景:物理内存 >= 64GB,且
"shared_buffers"设置很大(如32GB+)。
作用:减少TLB Miss,直接提升内存访问速度。
1. 计算页数:
"HugePages = (shared_buffers + 2GB) / 2MB"
2. 配置:
# 禁用透明大页(防干扰)
echo never > /sys/kernel/mm/transparent_hugepage/enabled
# 分配大页(假设需要20000页)
echo 20000 > /proc/sys/vm/nr_hugepages
# 修改用户限制(kingbase用户)
echo "kingbase soft memlock unlimited" >> /etc/security/limits.conf
echo "kingbase hard memlock unlimited" >> /etc/security/limits.conf
3. 数据库启用:在
"kingbase.conf"中设置
"huge_pages = on"
5. 资源限制(/etc/security/limits.conf)
防止“Too many open files”报错,特别是高并发查询时。
kingbase soft nofile 65536
kingbase hard nofile 65536
kingbase soft nproc 65536
kingbase hard nproc 65536
# 如果用了大页,必须加下面这行
kingbase soft memlock unlimited
kingbase hard memlock unlimited
6. 系统服务“坑位”修复
针对Systemd系统(CentOS 7+/Ubuntu 16+):
编辑
"/etc/systemd/logind.conf",设置
"RemoveIPC=no"。
原因:默认
"yes"会导致用户退出时清理IPC信号,可能造成Kingbase进程异常崩溃。
重启:
"systemctl restart systemd-logind"
7. 验证与监控
- 查看调度器:
"cat /sys/block/sdX/queue/scheduler"
- 查看大页:
"cat /proc/meminfo | grep -i huge"
- 查看脏页:
"cat /proc/vmstat | grep dirty"(如果
"nr_dirty"持续很高,说明I/O是瓶颈)