kingbase教程FG181-金仓数据库内存配置使用优化
内容简介:本文档详细介绍金仓数据库内存配置与使用优化方法,包括内存结构、参数配置、监控与调优等。风哥教程参考kingbase官方文档kingbase8系统管理员手册、kingbase8性能优化指南等。
Part01-基础概念与理论知识
1.1 内存结构概述
金仓数据库的内存结构主要包括以下几个部分:
- 共享内存(Shared Memory):
- 共享缓冲区(Shared Buffers):用于缓存数据页,减少磁盘I/O
- WAL缓冲区(WAL Buffers):用于缓存WAL日志,提高写入性能,风哥提示:
- 维护工作内存(Maintenance Work Memory):用于维护操作,如VACUUM、CREATE INDEX等
- 自动清理工作内存(Autovacuum Work Memory):用于自动清理操作
- 进程内存(Process Memory):
- 工作内存(Work Memory):用于排序、哈希等操作
- 语句内存(Statement Memory):用于单个语句的内存使用
- 本地内存(Local Memory):用于每个连接的本地数据
1.2 内存参数分类
内存参数分类:
- 共享内存参数:
- shared_buffers:共享缓冲区大小
- wal_buffers:WAL缓冲区大小
- maintenance_work_mem:维护工作内存大小
- autovacuum_work_mem:自动清理工作内存大小
- 进程内存参数:
- work_mem:工作内存大小,学习交流加群风哥微信: itpux-com
- statement_mem:语句内存大小
- temp_buffers:临时缓冲区大小
- 内存相关参数:
- max_connections:最大连接数
- max_parallel_workers:最大并行工作线程数
- max_parallel_workers_per_gather:每个 gather 操作的最大并行工作线程数
1.3 内存使用监控
内存使用监控:
- 系统级监控:使用top、free、vmstat等命令监控系统内存使用
- 数据库级监控:使用pg_stat_activity、pg_stat_database等系统视图监控数据库内存使用
- 性能视图:使用pg_stat_bgwriter、pg_stat_statements等视图监控内存相关性能指标
Part02-生产环境规划与建议
2.1 内存配置原则
内存配置原则:
- 根据系统内存大小配置:一般建议将系统内存的25%-30%分配给shared_buffers
- 考虑并发连接数:max_connections * work_mem 不应超过系统内存的50%,学习交流加群风哥QQ113257174
- 考虑维护操作:maintenance_work_mem 应根据系统内存大小适当配置
- 考虑并行操作:max_parallel_workers_per_gather 应根据CPU核心数适当配置
- 避免内存不足:确保系统有足够的内存用于操作系统和其他应用
2.2 不同负载场景的内存配置
不同负载场景的内存配置:
- OLTP场景(在线事务处理):
- shared_buffers:系统内存的25%-30%
- work_mem:较小,一般为16-64MB
- maintenance_work_mem:适中,一般为256MB-1GB
- OLAP场景(在线分析处理):
- shared_buffers:系统内存的30%-50%
- work_mem:较大,一般为256MB-1GB
- maintenance_work_mem:较大,一般为1GB-2GB
- 混合场景:
- shared_buffers:系统内存的30%,更多视频教程www.fgedu.net.cn
- work_mem:适中,一般为64-256MB
- maintenance_work_mem:适中,一般为512MB-1GB
2.3 大内存页配置
大内存页配置:
- 什么是大内存页:大内存页是一种内存管理技术,使用更大的内存页面大小(如2MB或4MB),减少内存管理开销
- 大内存页的优点:减少TLB(Translation Lookaside Buffer) misses,提高内存访问性能
- 大内存页的配置:需要在操作系统层面和数据库层面进行配置
Part03-生产环境项目实施方案
3.1 内存参数配置
内存参数配置步骤:
- 分析系统内存:了解系统的总内存大小
- 确定内存分配:根据负载类型和系统内存大小,确定各内存参数的配置值
- 修改配置文件:修改postgresql.conf文件,设置内存参数
- 重启数据库:使配置生效
- 验证配置:验证配置是否生效,更多学习教程公众号风哥教程itpux_com
3.2 内存使用监控
内存使用监控步骤:
- 系统级监控:使用top、free、vmstat等命令监控系统内存使用
- 数据库级监控:使用pg_stat_activity、pg_stat_database等系统视图监控数据库内存使用
- 性能视图:使用pg_stat_bgwriter、pg_stat_statements等视图监控内存相关性能指标
- 设置告警:设置内存使用告警,及时发现内存问题
3.3 内存优化调优
内存优化调优步骤:
- 分析内存使用情况:了解数据库的内存使用情况
- 识别内存瓶颈:找出内存使用的瓶颈
- 调整内存参数:根据分析结果,调整内存参数
- 验证优化效果:验证优化后的效果
- 持续监控:持续监控内存使用情况,及时调整,from DB视频:www.itpux.com
Part04-生产案例与实战讲解
4.1 内存参数配置实战
内存参数配置实战:
# 查看系统内存
$ free -h
# 输出日志
total used free shared buff/cache available
Mem: 64G 8.0G 50G 200M 6.0G 55G
Swap: 0B 0B 0B
# 修改postgresql.conf
$ vi /kingbase/data/postgresql.conf
# 添加以下配置
# 共享内存参数
shared_buffers = 16GB # 系统内存的25%
wal_buffers = 16MB # 16MB
maintenance_work_mem = 1GB # 1GB
autovacuum_work_mem = 256MB # 256MB
# 进程内存参数
work_mem = 64MB # 64MB
statement_mem = 128MB # 128MB
temp_buffers = 8MB # 8MB
# 连接参数
max_connections = 1000 # 最大连接数
# 并行参数
max_parallel_workers = 8 # 并行工作线程数
max_parallel_workers_per_gather = 4 # 每个gather操作的并行工作线程数
# 重启数据库
$ systemctl restart kingbase
# 验证配置
$ psql -h fgedu.localhost -p 54321 -U fgedu -d fgedudb -c “SHOW shared_buffers;”
# 输出日志
shared_buffers
—————-
16GB
$ psql -h fgedu.localhost -p 54321 -U fgedu -d fgedudb -c “SHOW work_mem;”
# 输出日志
work_mem
———-
64MB
$ psql -h fgedu.localhost -p 54321 -U fgedu -d fgedudb -c “SHOW maintenance_work_mem;”
# 输出日志
maintenance_work_mem
———————-
1GB
4.2 内存使用监控实战
内存使用监控实战:
# 系统级监控
$ top
# 输出日志(示例)
top – 10:00:00 up 10 days, 8:00, 2 users, load average: 0.50, 0.40, 0.30
Tasks: 200 total, 1 running, 199 sleeping, 0 stopped, 0 zombie
%Cpu(s): 5.0 us, 2.0 sy, 0.0 ni, 93.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
MiB Mem : 65536.0 total, 51200.0 free, 8192.0 used, 6144.0 buff/cache
MiB Swap: 0.0 total, 0.0 free, 0.0 used. 56320.0 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1234 kingbase 20 0 20.0g 16.0g 15.5g S 5.0 25.0 1:00.00 kbserver
5678 kingbase 20 0 2.0g 1.0g 0.8g S 2.0 1.5 0:30.00 postgres: logger process
9012 kingbase 20 0 2.0g 1.0g 0.8g S 1.0 1.5 0:20.00 postgres: checkpointer process
3456 kingbase 20 0 2.0g 1.0g 0.8g S 1.0 1.5 0:15.00 postgres: writer process
7890 kingbase 20 0 2.0g 1.0g 0.8g S 1.0 1.5 0:10.00 postgres: wal writer process
# 数据库级监控
$ psql -h fgedu.localhost -p 54321 -U fgedu -d fgedudb -c “SELECT pid, usename, state, query, backend_start, client_addr FROM pg_stat_activity WHERE state = ‘active’;”
# 输出日志
pid | usename | state | query | backend_start | client_addr
——+———+——–+————————————-+——————————-+————- 1234 | fgedu | active | SELECT * FROM fgedu_employee WHERE department = ‘技术部’ | 2026-04-09 10:00:00.000000+08 | 192.168.1.1
5678 | fgedu | active | SELECT * FROM fgedu_sales WHERE sale_date BETWEEN ‘2026-01-01’ AND ‘2026-03-31’ | 2026-04-09 10:00:01.000000+08 | 192.168.1.2
# 监控内存相关性能指标
$ psql -h fgedu.localhost -p 54321 -U fgedu -d fgedudb -c “SELECT * FROM pg_stat_bgwriter;”
# 输出日志
checkpoints_timed | checkpoints_req | checkpoint_write_time | checkpoint_sync_time | buffers_checkpoint | buffers_clean | maxwritten_clean | buffers_backend | buffers_backend_fsync | buffers_alloc
——————-+—————–+———————–+———————-+——————-+—————+——————+—————-+————————+—————
100 | 10 | 10000 | 100 | 10000 | 5000 | 100 | 2000 | 0 | 100000
# 监控语句内存使用
$ psql -h fgedu.localhost -p 54321 -U fgedu -d fgedudb -c “SELECT queryid, query, mean_exec_time, max_exec_time, mean_rows, shared_blks_hit, shared_blks_read FROM pg_stat_statements ORDER BY mean_exec_time DESC LIMIT 10;”
# 输出日志
queryid | query | mean_exec_time | max_exec_time | mean_rows | shared_blks_hit | shared_blks_read
———+————————————-+—————-+—————-+———–+—————–+——————- 123456 | SELECT * FROM fgedu_sales WHERE sale_date BETWEEN $1 AND $2 | 100.5 | 200.0 | 1000 | 5000 | 100
789012 | SELECT * FROM fgedu_employee WHERE department = $1 | 50.2 | 100.0 | 50 | 1000 | 0
4.3 内存优化调优实战
内存优化调优实战:
# 分析内存使用情况
$ psql -h fgedu.localhost -p 54321 -U fgedu -d fgedudb -c “SELECT name, setting, unit FROM pg_settings WHERE name IN (‘shared_buffers’, ‘work_mem’, ‘maintenance_work_mem’, ‘max_connections’);”
# 输出日志
name | setting | unit
———————-+———+——
shared_buffers | 16GB |
work_mem | 64MB |
maintenance_work_mem | 1GB |
max_connections | 1000 |
# 识别内存瓶颈
# 假设发现排序操作频繁,需要增加work_mem
# 调整work_mem参数
$ vi /kingbase/data/postgresql.conf
# 修改work_mem参数
work_mem = 128MB # 128MB
# 重启数据库
$ systemctl restart kingbase
# 验证配置
$ psql -h fgedu.localhost -p 54321 -U fgedu -d fgedudb -c “SHOW work_mem;”
# 输出日志
work_mem
———-
128MB
# 测试排序性能
$ psql -h fgedu.localhost -p 54321 -U fgedu -d fgedudb -c “EXPLAIN ANALYZE SELECT * FROM fgedu_sales ORDER BY amount DESC LIMIT 100;”
# 输出日志(优化前)
QUERY PLAN
———————————————————————————————————————-
Limit (cost=10000000000.00..10000000050.00 rows=100 width=20) (actual time=100.000..200.000 rows=100 loops=1)
-> Gather Merge (cost=10000000000.00..10000005000.00 rows=10000 width=20) (actual time=100.000..200.000 rows=100 loops=1)
Workers Planned: 4
Workers Launched: 4
-> Sort (cost=10000000000.00..10000000012.50 rows=2500 width=20) (actual time=50.000..100.000 rows=25 loops=4)
Sort Key: amount DESC
Sort Method: external merge Disk: 1024kB
-> Parallel Seq Scan on fgedu_sales (cost=0.00..10000000000.00 rows=2500 width=20) (actual time=0.000..10.000 rows=2500 loops=4)
Planning Time: 0.100 ms
Execution Time: 200.100 ms
# 测试排序性能(优化后)
$ psql -h fgedu.localhost -p 54321 -U fgedu -d fgedudb -c “EXPLAIN ANALYZE SELECT * FROM fgedu_sales ORDER BY amount DESC LIMIT 100;”
# 输出日志(优化后)
QUERY PLAN
———————————————————————————————————————-
Limit (cost=10000000000.00..10000000030.00 rows=100 width=20) (actual time=50.000..100.000 rows=100 loops=1)
-> Gather Merge (cost=10000000000.00..10000003000.00 rows=10000 width=20) (actual time=50.000..100.000 rows=100 loops=1)
Workers Planned: 4
Workers Launched: 4
-> Sort (cost=10000000000.00..10000000006.25 rows=2500 width=20) (actual time=25.000..50.000 rows=25 loops=4)
Sort Key: amount DESC
Sort Method: quicksort Memory: 512kB
-> Parallel Seq Scan on fgedu_sales (cost=0.00..10000000000.00 rows=2500 width=20) (actual time=0.000..10.000 rows=2500 loops=4)
Planning Time: 0.100 ms
Execution Time: 100.100 ms
4.4 性能测试与验证
性能测试与验证:
# 测试查询性能
$ psql -h fgedu.localhost -p 54321 -U fgedu -d fgedudb -c “EXPLAIN ANALYZE SELECT * FROM fgedu_sales WHERE sale_date BETWEEN ‘2026-01-01’ AND ‘2026-03-31’;”
# 输出日志
QUERY PLAN
———————————————————————————————————————-
Index Scan using idx_fgedu_sales_sale_date on fgedu_sales (cost=0.29..8.31 rows=30 width=20) (actual time=0.050..0.100 rows=30 loops=1)
Index Cond: ((sale_date >= ‘2026-01-01’::date) AND (sale_date <= '2026-03-31'::date))
Planning Time: 0.100 ms
Execution Time: 0.150 ms
# 测试插入性能
$ psql -h fgedu.localhost -p 54321 -U fgedu -d fgedudb -c “EXPLAIN ANALYZE INSERT INTO fgedu_sales (sale_date, product_id, quantity, amount) VALUES (‘2026-04-01’, 1, 10, 100.00);”
# 输出日志
QUERY PLAN
———————————————————————————————————————-
Insert on fgedu_sales (cost=0.00..0.01 rows=1 width=20) (actual time=0.010..0.015 rows=1 loops=1)
-> Result (cost=0.00..0.01 rows=1 width=20) (actual time=0.005..0.005 rows=1 loops=1)
Planning Time: 0.100 ms
Execution Time: 0.020 ms
# 测试更新性能
$ psql -h fgedu.localhost -p 54321 -U fgedu -d fgedudb -c “EXPLAIN ANALYZE UPDATE fgedu_sales SET amount = amount * 1.1 WHERE sale_date = ‘2026-04-01’;”
# 输出日志
QUERY PLAN
———————————————————————————————————————-
Update on fgedu_sales (cost=0.29..8.31 rows=1 width=20) (actual time=0.015..0.020 rows=1 loops=1)
-> Index Scan using idx_fgedu_sales_sale_date on fgedu_sales (cost=0.29..8.31 rows=1 width=20) (actual time=0.010..0.012 rows=1 loops=1)
Index Cond: (sale_date = ‘2026-04-01’::date)
Planning Time: 0.100 ms
Execution Time: 0.025 ms
# 测试删除性能
$ psql -h fgedu.localhost -p 54321 -U fgedu -d fgedudb -c “EXPLAIN ANALYZE DELETE FROM fgedu_sales WHERE sale_date = ‘2026-04-01’;”
# 输出日志
QUERY PLAN
———————————————————————————————————————-
Delete on fgedu_sales (cost=0.29..8.31 rows=1 width=20) (actual time=0.015..0.020 rows=1 loops=1)
-> Index Scan using idx_fgedu_sales_sale_date on fgedu_sales (cost=0.29..8.31 rows=1 width=20) (actual time=0.010..0.012 rows=1 loops=1)
Index Cond: (sale_date = ‘2026-04-01’::date)
Planning Time: 0.100 ms
Execution Time: 0.025 ms
Part05-风哥经验总结与分享
5.1 内存配置常见问题与解决方案
内存配置常见问题与解决方案:
- 内存不足:增加系统内存或调整内存参数,减少内存使用
- 内存泄漏:检查应用程序,确保正确释放内存
- 排序溢出到磁盘:增加work_mem参数,减少排序操作的磁盘使用
- 共享缓冲区利用率低:调整shared_buffers参数,提高共享缓冲区利用率
- 维护操作内存不足:增加maintenance_work_mem参数,提高维护操作性能
5.2 内存配置最佳实践
内存配置最佳实践:
- 根据系统内存大小配置:一般建议将系统内存的25%-30%分配给shared_buffers
- 考虑并发连接数:max_connections * work_mem 不应超过系统内存的50%
- 考虑维护操作:maintenance_work_mem 应根据系统内存大小适当配置
- 考虑并行操作:max_parallel_workers_per_gather 应根据CPU核心数适当配置
- 使用大内存页:配置大内存页,提高内存访问性能
- 监控内存使用:持续监控内存使用情况,及时调整配置
5.3 内存优化脚本分享
以下是一个内存优化脚本示例:
#!/bin/bash
# memory_optimization.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: `http://www.fgedu.net.cn`
# 配置信息
DB_HOME=”/kingbase”
DB_DATA=”${DB_HOME}/data”
LOG_FILE=”${DB_HOME}/log/memory_optimization.log”
# 记录日志
log() {
echo “$(date ‘+%Y-%m-%d %H:%M:%S’) – $1” >> $LOG_FILE
}
# 检查系统内存
check_system_memory() {
log “检查系统内存…”
TOTAL_MEM=$(free -g | grep Mem | awk ‘{print $2}’)
FREE_MEM=$(free -g | grep Mem | awk ‘{print $4}’)
USED_MEM=$(free -g | grep Mem | awk ‘{print $3}’)
log “系统总内存: ${TOTAL_MEM}GB”
log “系统可用内存: ${FREE_MEM}GB”
log “系统已用内存: ${USED_MEM}GB”
return $TOTAL_MEM
}
# 计算内存参数
calculate_memory_params() {
local total_mem=$1
log “计算内存参数…”
# 计算shared_buffers(系统内存的25%)
SHARED_BUFFERS=$((total_mem * 25 / 100))GB
log “shared_buffers: ${SHARED_BUFFERS}”
# 计算work_mem(根据并发连接数)
MAX_CONNECTIONS=1000
WORK_MEM=$((total_mem * 50 / 100 / MAX_CONNECTIONS))MB
if [ $WORK_MEM -lt 16 ]; then
WORK_MEM=16MB
fi
log “work_mem: ${WORK_MEM}”
# 计算maintenance_work_mem(系统内存的2%)
MAINTENANCE_WORK_MEM=$((total_mem * 2 / 100))GB
if [ $MAINTENANCE_WORK_MEM -lt 1 ]; then
MAINTENANCE_WORK_MEM=1GB
fi
log “maintenance_work_mem: ${MAINTENANCE_WORK_MEM}”
# 计算wal_buffers(16MB)
WAL_BUFFERS=16MB
log “wal_buffers: ${WAL_BUFFERS}”
}
# 配置内存参数
configure_memory_params() {
log “配置内存参数…”
# 备份配置文件
cp ${DB_DATA}/postgresql.conf ${DB_DATA}/postgresql.conf.bak
# 修改配置文件
sed -i “s/^shared_buffers =.*/shared_buffers = ${SHARED_BUFFERS}/” ${DB_DATA}/postgresql.conf
sed -i “s/^work_mem =.*/work_mem = ${WORK_MEM}/” ${DB_DATA}/postgresql.conf
sed -i “s/^maintenance_work_mem =.*/maintenance_work_mem = ${MAINTENANCE_WORK_MEM}/” ${DB_DATA}/postgresql.conf
sed -i “s/^wal_buffers =.*/wal_buffers = ${WAL_BUFFERS}/” ${DB_DATA}/postgresql.conf
log “内存参数配置完成”
}
# 重启数据库
restart_database() {
log “重启数据库…”
systemctl restart kingbase
if [ $? -eq 0 ]; then
log “数据库重启成功”
else
log “数据库重启失败”
fi
}
# 验证配置
verify_configuration() {
log “验证配置…”
psql -h fgedu.localhost -p 54321 -U fgedu -d fgedudb -c “SHOW shared_buffers;”
psql -h fgedu.localhost -p 54321 -U fgedu -d fgedudb -c “SHOW work_mem;”
psql -h fgedu.localhost -p 54321 -U fgedu -d fgedudb -c “SHOW maintenance_work_mem;”
psql -h fgedu.localhost -p 54321 -U fgedu -d fgedudb -c “SHOW wal_buffers;”
log “配置验证完成”
}
# 主函数
main() {
log “开始内存优化”
TOTAL_MEM=$(check_system_memory)
calculate_memory_params $TOTAL_MEM
configure_memory_params
restart_database
verify_configuration
log “内存优化完成”
}
# 执行主函数
main
风哥提示:内存配置是数据库性能优化的重要组成部分,通过合理的内存配置,可以显著提高数据库的性能和稳定性。
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
