opengauss教程FG073-openGauss内存配置与使用优化生产实战解析
目录大纲
- Part01-基础概念与理论知识
- 1.1 openGauss内存结构
- 1.2 内存参数的作用
- 1.3 内存使用的常见问题
- Part02-生产环境规划与建议
- 2.1 内存资源规划
- 2.2 内存监控体系设计
- Part03-生产环境项目实施方案
- 3.1 系统级内存优化
- 3.2 数据库级内存配置
- Part04-生产案例与实战讲解
- 4.1 内存使用监控实战
- 4.2 内存参数优化实战
- 4.3 大页内存配置实战
- 4.4 内存监控脚本
- Part05-风哥经验总结与分享
- 5.1 内存优化经验
- 5.2 性能优化建议
Part01-基础概念与理论知识
1.1 openGauss内存结构
openGauss数据库的内存结构主要包括以下几个部分:
1. 共享内存(Shared Memory):存储全局数据结构,如缓冲区、锁表等
2. 本地内存(Local Memory):每个后端进程的私有内存
3. 工作内存(Work Memory):用于排序、哈希等操作的内存
4. 维护内存(Maintenance Memory):用于VACUUM等维护操作的内存
5. 会话内存(Session Memory):每个会话的内存分配
1.2 内存参数的作用
openGauss的主要内存参数及其作用:
1. shared_buffers:共享缓冲区大小,用于缓存数据和索引块
2. work_mem:每个操作的工作内存大小
风哥提示:
3. maintenance_work_mem:维护操作的内存大小
4. effective_cache_size:系统缓存大小估计
5. shared_memory_type:共享内存类型
6. max_process_memory:数据库进程最大内存使用量
1.3 内存使用的常见问题
内存使用的常见问题:
1. 内存不足:导致频繁换页,性能下降
2. 内存配置过大:导致系统OOM,进程被kill
3. 内存泄漏:内存使用持续增长
4. 内存碎片:内存利用率低
5. 大页内存未配置:内存访问效率低
Part02-生产环境规划与建议
2.1 内存资源规划
内存资源规划是数据库性能的关键:
1. 总内存估算:根据数据库大小和并发数估算内存需求
2. 内存分配比例:
– shared_buffers:总内存的25%左右
– work_mem:根据并发数和查询复杂度调整
– 系统预留:至少保留20%内存给系统
学习交流加群风哥微信: itpux-com
3. 大页内存:启用大页内存提高内存访问效率
4. 内存监控:建立内存使用监控体系
2.2 内存监控体系设计
建立完善的内存监控体系:
1. 实时监控:实时监控内存使用情况
2. 历史分析:记录内存使用历史,用于趋势分析
3. 告警机制:设置合理的内存使用告警阈值
4. 关联分析:关联内存使用与数据库活动
Part03-生产环境项目实施方案
3.1 系统级内存优化
系统级内存优化配置:
vm.swappiness = 10 # 减少交换使用
vm.overcommit_memory = 0 # 严格内存分配
vm.overcommit_ratio = 90 # 内存过度提交比例
vm.dirty_background_ratio = 5 # 脏页后台写入阈值
vm.dirty_ratio = 10 # 脏页强制写入阈值
vm.overcommit_memory = 0学习交流加群风哥QQ113257174
vm.overcommit_ratio = 90
vm.dirty_background_ratio = 5
vm.dirty_ratio = 10
3.2 数据库级内存配置
openGauss数据库内存参数配置:
— 查看当前内存参数
SHOW shared_buffers;
SHOW work_mem;
SHOW maintenance_work_mem;
SHOW effective_cache_size;
SHOW max_process_memory;
—————-
8GB
(1 row)
work_mem
———-
16MB
(1 row)
maintenance_work_mem
———————-
1GB
(1 row)
effective_cache_size
———————-
24GB
(1 row)
max_process_memory更多视频教程www.fgedu.net.cn
——————–
24GB
(1 row)
ALTER SYSTEM SET shared_buffers = ‘8GB’;
# 总内存的25%
ALTER SYSTEM SET work_mem = ’64MB’;
# 增加工作内存
ALTER SYSTEM SET maintenance_work_mem = ‘2GB’;
# 增加维护内存
ALTER SYSTEM SET effective_cache_size = ’24GB’;
# 总内存的75%
ALTER SYSTEM SET max_process_memory = ’28GB’;
# 总内存的87.5%
— 重新加载配置
SELECT pg_reload_conf();
—————-
t
(1 row)
Part04-生产案例与实战讲解
4.1 内存使用监控实战
实战演示内存使用监控:
Mem: 32G 20G 2G 4G 10G 8G
Swap: 8G 0B 8G
# top
Tasks: 285 total, 1 running, 284 sleeping, 0 stopped, 0 zombie
%Cpu(s): 15.2 us, 5.8 sy, 0.0 ni, 76.5 id, 2.0 wa, 0.0 hi, 0.5 si, 0.0 st
KiB Mem : 32768000 total, 2048000 free, 22528000 used, 8192000 buff/cache
KiB Swap: 8388608 total, 8388608 free, 0 used. 8192000 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
12345 omm 20 0 20.5g 5.2g 4.8g S 15.0 16.5 12:30.45 gaussdb
6789 root 20 0 120m 20m 15m S 5.0 0.1 0:30.12 sshd
1234 root 20 0 500m 50m 40m S 2.5 0.2 1:15.34 httpd
— 查看数据库内存使用
SELECT
name,
setting,
unit,
context,
source
FROM pg_settings
WHERE name LIKE ‘%memory%’ OR name LIKE ‘%buffer%’
ORDER BY name;
from DB视频:www.itpux.com
————————–+———–+——+————+——–
dynamic_shared_memory_type | posix | | postmaster | default
effective_cache_size | 25165824 | 8kB | user | configuration file
maintenance_work_mem | 2097152 | 8kB | user | configuration file
max_process_memory | 29360128 | 8kB | postmaster | configuration file
shared_buffers | 1048576 | 8kB | postmaster | configuration file
work_mem | 8192 | 8kB | user | configuration file
(6 rows)
4.2 内存参数优化实战
实战演示内存参数优化:
— 查看当前并发数
SELECT count(*) FROM pg_stat_activity WHERE state = ‘active’;
——-
20
(1 row)
— 可用内存 = 总内存 – shared_buffers – 系统预留 – 其他进程
— work_mem = 可用内存 / (并发数 * 2)
ALTER SYSTEM SET work_mem = ‘128MB’;
SELECT pg_reload_conf();
pg_reload_conf
—————-
t
(1 row)
EXPLAIN ANALYZE SELECT * FROM fgedu_orders ORDER BY total_amount DESC LIMIT 1000;
————————————————————————————————————————-
Limit (cost=10000000000.00..10000000500.00 rows=1000 width=100) (actual time=0.100..50.000 rows=1000 loops=1)
-> Gather Merge (cost=10000000000.00..10000050000.00 rows=100000 width=100) (actual time=0.100..50.000 rows=1000 loops=1)
Workers Planned: 4
Workers Launched: 4
-> Sort (cost=10000000000.00..10000000125.00 rows=25000 width=100) (actual time=0.050..10.000 rows=200 loops=5)
Sort Key: total_amount DESC
Sort Method: quicksort Memory: 5000kB
-> Parallel Seq Scan on fgedu_orders (cost=0.00..10000000000.00 rows=25000 width=100) (actual time=0.010..5.000 rows=20000 loops=5)
Planning Time: 0.100 ms
Execution Time: 50.100 ms
(10 rows)
4.3 大页内存配置实战
配置大页内存以提高内存访问效率:
vm.nr_hugepages = 8192 # 8GB大页内存
vm.hugetlb_shm_group = 1000 # omm用户组ID
vm.hugetlb_shm_group = 1000
ShmemHugePages: 0 kB
FileHugePages: 0 kB
HugePages_Total: 8192
HugePages_Free: 8192
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
Hugetlb: 16777216 kB
— 启用大页内存
ALTER SYSTEM SET shared_memory_type = ‘huge’;
server stopped
waiting for server to start….2024-01-15 14:30:00.000 CST [12345] LOG: 00000: database system was shut down at 2024-01-15 14:29:59 CST
2024-01-15 14:30:00.000 CST [12345] LOG: 00000: database system is ready to accept connections
done
server started
ShmemHugePages: 0 kB
FileHugePages: 0 kB
HugePages_Total: 8192
HugePages_Free: 4096
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
Hugetlb: 16777216 kB
4.4 内存监控脚本
编写内存监控脚本:
# memory_monitor.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: `http://www.fgedu.net.cn`
# openGauss内存监控脚本
LOG_DIR=”/opengauss/log/memory”
mkdir -p $LOG_DIR
LOG_FILE=”$LOG_DIR/memory_monitor_$(date ‘+%Y%m%d’).log”
log() {
echo “[$(date ‘+%Y-%m-%d %H:%M:%S’)] $1” | tee -a $LOG_FILE
}
check_system_memory() {
log “=== 系统内存使用情况 ===”
# 内存使用
log “内存使用:
$(free -h)”
# 大页内存
log “大页内存使用:
$(grep Huge /proc/meminfo)”
# 进程内存使用
log “进程内存使用排行:
$(ps aux –sort=-%mem | head -10)”
# gaussdb进程内存使用
log “gaussdb进程内存使用:
$(ps aux | grep gaussdb | grep -v grep)”
}
check_database_memory() {
log “=== 数据库内存配置 ===”
# 内存参数
log “数据库内存参数:
$(gsql -h 192.168.1.10 -d fgedudb -U fgedu -t -c ”
SELECT
name,
setting,
unit,
context
FROM pg_settings
WHERE name LIKE ‘%memory%’ OR name LIKE ‘%buffer%’
ORDER BY name;
“)”
# 连接数
connections=$(gsql -h 192.168.1.10 -d fgedudb -U fgedu -t -c ”
SELECT count(*) FROM pg_stat_activity;
” | tr -d ‘ ‘)
log “当前连接数: $connections”
# 活跃连接
active_connections=$(gsql -h 192.168.1.10 -d fgedudb -U fgedu -t -c ”
SELECT count(*) FROM pg_stat_activity WHERE state = ‘active’;
” | tr -d ‘ ‘)
log “活跃连接数: $active_connections”
}
main() {
log “开始内存监控检查…”
check_system_memory
check_database_memory
log “内存监控检查完成”
}
main
# /opengauss/scripts/memory_monitor.sh
[2024-01-15 14:30:00] === 系统内存使用情况 ===
[2024-01-15 14:30:00] 内存使用:
total used free shared buff/cache available
Mem: 32G 20G 2G 4G 10G 8G
Swap: 8G 0B 8G
[2024-01-15 14:30:00] 大页内存使用:
AnonHugePages: 0 kB
ShmemHugePages: 0 kB
FileHugePages: 0 kB
HugePages_Total: 8192
HugePages_Free: 4096
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
Hugetlb: 16777216 kB
[2024-01-15 14:30:00] 进程内存使用排行:
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
omm 12345 15.0 16.5 21474840 5452800 ? Ssl Jan14 12:30 gaussdb
root 6789 5.0 0.1 122880 20480 ? Ss Jan14 0:30 sshd
root 1234 2.5 0.2 512000 51200 ? Ss Jan14 1:15 httpd
[2024-01-15 14:30:01] gaussdb进程内存使用:
omm 12345 15.0 16.5 21474840 5452800 ? Ssl Jan14 12:30 /opengauss/app/bin/gaussdb -D /opengauss/fgdata
[2024-01-15 14:30:01] === 数据库内存配置 ===
[2024-01-15 14:30:01] 数据库内存参数:
name | setting | unit | context
————————–+———–+——+————
dynamic_shared_memory_type | posix | | postmaster
effective_cache_size | 25165824 | 8kB | user
maintenance_work_mem | 2097152 | 8kB | user
max_process_memory | 29360128 | 8kB | postmaster
shared_buffers | 1048576 | 8kB | postmaster
work_mem | 16384 | 8kB | user
[2024-01-15 14:30:01] 当前连接数: 30
[2024-01-15 14:30:01] 活跃连接数: 5
[2024-01-15 14:30:01] 内存监控检查完成
*/10 * * * * /opengauss/scripts/memory_monitor.sh > /dev/null 2>&1
Part05-风哥经验总结与分享
5.1 内存优化经验
风哥提示:内存配置是数据库性能的关键,需要根据实际情况进行合理调整。
1. 合理分配:根据系统总内存和数据库需求合理分配内存资源
2. 监控到位:建立完善的内存监控体系,及时发现内存问题
3. 参数调优:根据业务场景调整内存参数
4. 大页内存:启用大页内存提高内存访问效率
5. 避免过度配置:内存配置不宜过大,避免系统OOM
1. shared_buffers不宜设置过大,通常为总内存的25%左右
2. work_mem需要根据并发数调整,避免内存不足
3. 定期监控内存使用情况,及时发现内存泄漏
4. 大页内存配置需要考虑系统实际情况
5. 内存参数调整后需要观察系统表现
5.2 性能优化建议
1. 硬件层面:
– 选择高性能内存,确保足够的内存容量
– 启用内存双通道或四通道
– 考虑使用ECC内存提高可靠性
2. 系统层面:
– 优化操作系统内存参数
– 启用大页内存
– 减少交换空间使用
3. 数据库层面:
– 合理设置内存参数
– 优化查询计划,减少内存使用
– 定期清理内存碎片
4. 应用层面:
– 优化应用代码,减少内存使用
– 实现连接池,减少连接开销
– 合理使用缓存,减少数据库访问
1. 内存规划要考虑未来业务增长
2. 定期监控内存使用情况,建立基线
3. 根据业务特点调整内存参数
4. 启用大页内存提高性能
5. 内存优化是一个持续的过程,需要不断调整和优化
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
