opengauss教程FG028-性能优化基础
目录大纲
Part01-基础概念与理论知识
1.1 性能优化概述
性能优化是指通过各种方法和技术,提高系统的性能和响应速度,确保系统能够高效地处理业务请求。风哥教程参考opengauss官方文档,性能优化具有以下特点:
- 系统性:性能优化是一个系统工程,需要从多个层面进行优化
- 持续性:性能优化是一个持续的过程,需要定期监控和调优
- 针对性:性能优化需要针对具体的性能瓶颈进行
- 综合性:性能优化需要考虑硬件、操作系统、数据库和应用等多个方面
1.2 性能瓶颈识别
性能瓶颈是指系统中限制性能的关键因素,识别性能瓶颈是性能优化的第一步。常见的性能瓶颈包括:
- CPU瓶颈:
- CPU使用率过高
- CPU密集型操作
- 线程竞争
- 内存瓶颈:
- 内存不足
- 内存泄漏
- 内存碎片
- 存储瓶颈:
- 磁盘I/O性能不足
- 存储容量不足
- 存储争用
- 网络瓶颈:
- 网络带宽不足
- 网络延迟高
- 网络连接数限制
- 数据库瓶颈:
- SQL执行效率低
- 索引设计不合理
- 锁争用
- 参数配置不合理
1.3 性能优化方法
性能优化的主要方法包括:
- 系统级优化:
- 硬件升级
- 操作系统参数调优
- 网络优化
- 数据库级优化:
- 参数配置优化
- 存储优化
- 索引优化
- 分区表
- SQL级优化:
- SQL语句优化
- 查询计划优化
- 避免全表扫描
- 合理使用JOIN
风哥提示:
- 应用级优化:
- 缓存优化
- 连接池优化
- 代码优化
风哥提示:性能优化是一个持续的过程,需要定期监控和调优,以确保系统的性能能够满足业务需求。
Part02-生产环境规划与建议
2.1 系统级优化建议
生产环境系统级优化建议
- 硬件优化:
- 选择高性能的CPU和内存
- 使用SSD存储
- 配置足够的网络带宽
- 操作系统参数调优:
- 调整内核参数
- 优化文件系统
- 配置大内存页
- 关闭透明大页
- 关闭NUMA
学习交流加群风哥微信: itpux-com
- 网络优化:
- 配置合理的网络参数
- 使用高速网络
- 优化网络拓扑
2.2 数据库级优化建议
生产环境的数据库级优化建议:
- 参数配置优化:
- 调整shared_buffers
- 优化work_mem
- 调整maintenance_work_mem
- 配置effective_cache_size
- 优化随机页成本和顺序页成本
- 存储优化:
- 使用表空间
- 实施分区表
- 使用压缩存储
- 定期清理垃圾数据
- 索引优化:
- 为经常查询的列创建索引
- 为JOIN操作的列创建索引
- 避免创建过多索引
- 定期重建索引
学习交流加群风哥QQ113257174
- 并发控制:
- 优化锁策略
- 使用合适的隔离级别
- 避免长事务
2.3 SQL级优化建议
生产环境的SQL级优化建议:
- SQL语句优化:
- 避免使用SELECT *
- 使用LIMIT限制返回行数
- 避免在WHERE子句中使用函数
- 合理使用JOIN
- 避免使用子查询
- 查询计划优化:
- 使用EXPLAIN分析查询计划
- 优化查询计划
- 使用索引提示
- 统计信息:
- 定期更新统计信息
- 使用ANALYZE命令
- 事务管理:
- 保持事务简短
- 避免在事务中进行长时间操作
- 合理使用COMMIT和ROLLBACK
更多视频教程www.fgedu.net.cn
Part03-生产环境项目实施方案
3.1 性能监控工具
# 查看系统资源使用情况
[opengauss@fgedu.net.cn ~]$ top
top – 12:34:56 up 1 day, 2:34, 1 user, load average: 0.10, 0.05, 0.01
Tasks: 123 total, 1 running, 122 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.3 us, 0.1 sy, 0.0 ni, 99.6 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 16384000 total, 10240000 free, 4096000 used, 2048000 buff/cache
KiB Swap: 4096000 total, 4096000 free, 0 used. 11264000 avail Mem
# 查看磁盘I/O情况
[opengauss@fgedu.net.cn ~]$ iostat -x
Linux 5.4.0-100-generic (fgedu.net.cn) 01/01/2024 _x86_64_ (8 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
0.25 0.00 0.10 0.05 0.00 99.60
Device tps kB_read/s kB_wrtn/s kB_read kB_wrtn
sda 0.50 0.00 20.00 0 200
# 查看网络情况
[opengauss@fgedu.net.cn ~]$ netstat -tuln
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:5432 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:5432 0.0.0.0:* LISTEN
[opengauss@fgedu.net.cn ~]$ top
top – 12:34:56 up 1 day, 2:34, 1 user, load average: 0.10, 0.05, 0.01
Tasks: 123 total, 1 running, 122 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.3 us, 0.1 sy, 0.0 ni, 99.6 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 16384000 total, 10240000 free, 4096000 used, 2048000 buff/cache
KiB Swap: 4096000 total, 4096000 free, 0 used. 11264000 avail Mem
# 查看磁盘I/O情况
[opengauss@fgedu.net.cn ~]$ iostat -x
Linux 5.4.0-100-generic (fgedu.net.cn) 01/01/2024 _x86_64_ (8 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
0.25 0.00 0.10 0.05 0.00 99.60
Device tps kB_read/s kB_wrtn/s kB_read kB_wrtn
sda 0.50 0.00 20.00 0 200
# 查看网络情况
[opengauss@fgedu.net.cn ~]$ netstat -tuln
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:5432 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:5432 0.0.0.0:* LISTEN
3.2 性能分析方法
# 使用EXPLAIN分析查询计划
fgedudb=# EXPLAIN SELECT * FROM fgedu_employee WHERE age > 30;
QUERY PLAN
————————————————————————–
Seq Scan on fgedu_employee (cost=0.00..35.50 rows=10 width=44)
Filter: (age > 30)
更多学习教程公众号风哥教程itpux_com
(2 rows)
# 使用EXPLAIN ANALYZE分析查询执行情况
fgedudb=# EXPLAIN ANALYZE SELECT * FROM fgedu_employee WHERE age > 30;
QUERY PLAN
—————————————————————————————————-
Seq Scan on fgedu_employee (cost=0.00..35.50 rows=10 width=44) (actual time=0.012..0.015 rows=2 loops=1)
Filter: (age > 30)
Rows Removed by Filter: 2
Planning Time: 0.023 ms
Execution Time: 0.025 ms
(5 rows)
fgedudb=# EXPLAIN SELECT * FROM fgedu_employee WHERE age > 30;
QUERY PLAN
————————————————————————–
Seq Scan on fgedu_employee (cost=0.00..35.50 rows=10 width=44)
Filter: (age > 30)
更多学习教程公众号风哥教程itpux_com
(2 rows)
# 使用EXPLAIN ANALYZE分析查询执行情况
fgedudb=# EXPLAIN ANALYZE SELECT * FROM fgedu_employee WHERE age > 30;
QUERY PLAN
—————————————————————————————————-
Seq Scan on fgedu_employee (cost=0.00..35.50 rows=10 width=44) (actual time=0.012..0.015 rows=2 loops=1)
Filter: (age > 30)
Rows Removed by Filter: 2
Planning Time: 0.023 ms
Execution Time: 0.025 ms
(5 rows)
3.3 性能优化实施
# 调整内核参数
[opengauss@fgedu.net.cn ~]$ sudo vi /etc/sysctl.conf
# 添加以下参数
kernel.sem = 250 32000 100 128
kernel.shmmni = 4096
kernel.shmall = 1048576
kernel.shmmax = 536870912
fs.file-max = 6815744
# 应用内核参数
[opengauss@fgedu.net.cn ~]$ sudo sysctl -p
# 调整数据库参数
fgedudb=# ALTER SYSTEM SET shared_buffers = ‘4GB’;
ALTER SYSTEM
fgedudb=# ALTER SYSTEM SET work_mem = ’64MB’;
ALTER SYSTEM
from DB视频:www.itpux.com
fgedudb=# ALTER SYSTEM SET maintenance_work_mem = ‘1GB’;
ALTER SYSTEM
fgedudb=# ALTER SYSTEM SET effective_cache_size = ’12GB’;
ALTER SYSTEM
[opengauss@fgedu.net.cn ~]$ sudo vi /etc/sysctl.conf
# 添加以下参数
kernel.sem = 250 32000 100 128
kernel.shmmni = 4096
kernel.shmall = 1048576
kernel.shmmax = 536870912
fs.file-max = 6815744
# 应用内核参数
[opengauss@fgedu.net.cn ~]$ sudo sysctl -p
# 调整数据库参数
fgedudb=# ALTER SYSTEM SET shared_buffers = ‘4GB’;
ALTER SYSTEM
fgedudb=# ALTER SYSTEM SET work_mem = ’64MB’;
ALTER SYSTEM
from DB视频:www.itpux.com
fgedudb=# ALTER SYSTEM SET maintenance_work_mem = ‘1GB’;
ALTER SYSTEM
fgedudb=# ALTER SYSTEM SET effective_cache_size = ’12GB’;
ALTER SYSTEM
Part04-生产案例与实战讲解
4.1 系统级优化实战
# 检查系统资源使用情况
[opengauss@fgedu.net.cn ~]$ top
top – 12:34:56 up 1 day, 2:34, 1 user, load average: 0.10, 0.05, 0.01
Tasks: 123 total, 1 running, 122 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.3 us, 0.1 sy, 0.0 ni, 99.6 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 16384000 total, 10240000 free, 4096000 used, 2048000 buff/cache
KiB Swap: 4096000 total, 4096000 free, 0 used. 11264000 avail Mem
# 调整内核参数
[opengauss@fgedu.net.cn ~]$ sudo vi /etc/sysctl.conf
# 添加以下参数
kernel.sem = 250 32000 100 128
kernel.shmmni = 4096
kernel.shmall = 1048576
kernel.shmmax = 536870912
fs.file-max = 6815744
# 应用内核参数
[opengauss@fgedu.net.cn ~]$ sudo sysctl -p
# 配置大内存页
[opengauss@fgedu.net.cn ~]$ sudo vi /etc/sysctl.conf
# 添加以下参数
vm.nr_hugepages = 16384
# 应用内核参数
[opengauss@fgedu.net.cn ~]$ sudo sysctl -p
# 关闭透明大页
[opengauss@fgedu.net.cn ~]$ sudo vi /etc/default/grub
# 在GRUB_CMDLINE_LINUX中添加
transparent_hugepage=never
# 更新grub
[opengauss@fgedu.net.cn ~]$ sudo update-grub
# 重启系统
[opengauss@fgedu.net.cn ~]$ sudo reboot
[opengauss@fgedu.net.cn ~]$ top
top – 12:34:56 up 1 day, 2:34, 1 user, load average: 0.10, 0.05, 0.01
Tasks: 123 total, 1 running, 122 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.3 us, 0.1 sy, 0.0 ni, 99.6 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 16384000 total, 10240000 free, 4096000 used, 2048000 buff/cache
KiB Swap: 4096000 total, 4096000 free, 0 used. 11264000 avail Mem
# 调整内核参数
[opengauss@fgedu.net.cn ~]$ sudo vi /etc/sysctl.conf
# 添加以下参数
kernel.sem = 250 32000 100 128
kernel.shmmni = 4096
kernel.shmall = 1048576
kernel.shmmax = 536870912
fs.file-max = 6815744
# 应用内核参数
[opengauss@fgedu.net.cn ~]$ sudo sysctl -p
# 配置大内存页
[opengauss@fgedu.net.cn ~]$ sudo vi /etc/sysctl.conf
# 添加以下参数
vm.nr_hugepages = 16384
# 应用内核参数
[opengauss@fgedu.net.cn ~]$ sudo sysctl -p
# 关闭透明大页
[opengauss@fgedu.net.cn ~]$ sudo vi /etc/default/grub
# 在GRUB_CMDLINE_LINUX中添加
transparent_hugepage=never
# 更新grub
[opengauss@fgedu.net.cn ~]$ sudo update-grub
# 重启系统
[opengauss@fgedu.net.cn ~]$ sudo reboot
4.2 数据库级优化实战
# 调整数据库参数
fgedudb=# ALTER SYSTEM SET shared_buffers = ‘4GB’;
ALTER SYSTEM
fgedudb=# ALTER SYSTEM SET work_mem = ’64MB’;
ALTER SYSTEM
fgedudb=# ALTER SYSTEM SET maintenance_work_mem = ‘1GB’;
ALTER SYSTEM
fgedudb=# ALTER SYSTEM SET effective_cache_size = ’12GB’;
ALTER SYSTEM
fgedudb=# ALTER SYSTEM SET random_page_cost = 4.0;
ALTER SYSTEM
fgedudb=# ALTER SYSTEM SET seq_page_cost = 1.0;
ALTER SYSTEM
# 重启数据库使参数生效
[opengauss@fgedu.net.cn ~]$ gs_ctl restart -D /opengauss/fgdata
waiting for server to shut down…. done
server stopped
waiting for server to start…. done
server started
# 创建索引
fgedudb=# CREATE INDEX idx_fgedu_employee_age ON fgedu_employee(age);
CREATE INDEX
# 分析表统计信息
fgedudb=# ANALYZE fgedu_employee;
ANALYZE
fgedudb=# ALTER SYSTEM SET shared_buffers = ‘4GB’;
ALTER SYSTEM
fgedudb=# ALTER SYSTEM SET work_mem = ’64MB’;
ALTER SYSTEM
fgedudb=# ALTER SYSTEM SET maintenance_work_mem = ‘1GB’;
ALTER SYSTEM
fgedudb=# ALTER SYSTEM SET effective_cache_size = ’12GB’;
ALTER SYSTEM
fgedudb=# ALTER SYSTEM SET random_page_cost = 4.0;
ALTER SYSTEM
fgedudb=# ALTER SYSTEM SET seq_page_cost = 1.0;
ALTER SYSTEM
# 重启数据库使参数生效
[opengauss@fgedu.net.cn ~]$ gs_ctl restart -D /opengauss/fgdata
waiting for server to shut down…. done
server stopped
waiting for server to start…. done
server started
# 创建索引
fgedudb=# CREATE INDEX idx_fgedu_employee_age ON fgedu_employee(age);
CREATE INDEX
# 分析表统计信息
fgedudb=# ANALYZE fgedu_employee;
ANALYZE
4.3 SQL级优化实战
# 优化前的查询
fgedudb=# EXPLAIN ANALYZE SELECT * FROM fgedu_employee WHERE age > 30;
QUERY PLAN
—————————————————————————————————-
Seq Scan on fgedu_employee (cost=0.00..35.50 rows=10 width=44) (actual time=0.012..0.015 rows=2 loops=1)
Filter: (age > 30)
Rows Removed by Filter: 2
Planning Time: 0.023 ms
Execution Time: 0.025 ms
(5 rows)
# 创建索引后
fgedudb=# CREATE INDEX idx_fgedu_employee_age ON fgedu_employee(age);
CREATE INDEX
fgedudb=# EXPLAIN ANALYZE SELECT * FROM fgedu_employee WHERE age > 30;
QUERY PLAN
————————————————————————————————–
Bitmap Heap Scan on fgedu_employee (cost=4.30..13.80 rows=10 width=44) (actual time=0.010..0.012 rows=2 loops=1)
Recheck Cond: (age > 30)
Heap Blocks: exact=1
-> Bitmap Index Scan on idx_fgedu_employee_age (cost=0.00..4.29 rows=10 width=0) (actual time=0.008..0.008 rows=2 loops=1)
Index Cond: (age > 30)
Planning Time: 0.035 ms
Execution Time: 0.020 ms
(7 rows)
# 优化SQL语句
fgedudb=# EXPLAIN ANALYZE SELECT id, name FROM fgedu_employee WHERE age > 30;
QUERY PLAN
————————————————————————————————–
Bitmap Heap Scan on fgedu_employee (cost=4.30..13.80 rows=10 width=22) (actual time=0.009..0.011 rows=2 loops=1)
Recheck Cond: (age > 30)
Heap Blocks: exact=1
-> Bitmap Index Scan on idx_fgedu_employee_age (cost=0.00..4.29 rows=10 width=0) (actual time=0.007..0.007 rows=2 loops=1)
Index Cond: (age > 30)
Planning Time: 0.030 ms
Execution Time: 0.018 ms
(7 rows)
fgedudb=# EXPLAIN ANALYZE SELECT * FROM fgedu_employee WHERE age > 30;
QUERY PLAN
—————————————————————————————————-
Seq Scan on fgedu_employee (cost=0.00..35.50 rows=10 width=44) (actual time=0.012..0.015 rows=2 loops=1)
Filter: (age > 30)
Rows Removed by Filter: 2
Planning Time: 0.023 ms
Execution Time: 0.025 ms
(5 rows)
# 创建索引后
fgedudb=# CREATE INDEX idx_fgedu_employee_age ON fgedu_employee(age);
CREATE INDEX
fgedudb=# EXPLAIN ANALYZE SELECT * FROM fgedu_employee WHERE age > 30;
QUERY PLAN
————————————————————————————————–
Bitmap Heap Scan on fgedu_employee (cost=4.30..13.80 rows=10 width=44) (actual time=0.010..0.012 rows=2 loops=1)
Recheck Cond: (age > 30)
Heap Blocks: exact=1
-> Bitmap Index Scan on idx_fgedu_employee_age (cost=0.00..4.29 rows=10 width=0) (actual time=0.008..0.008 rows=2 loops=1)
Index Cond: (age > 30)
Planning Time: 0.035 ms
Execution Time: 0.020 ms
(7 rows)
# 优化SQL语句
fgedudb=# EXPLAIN ANALYZE SELECT id, name FROM fgedu_employee WHERE age > 30;
QUERY PLAN
————————————————————————————————–
Bitmap Heap Scan on fgedu_employee (cost=4.30..13.80 rows=10 width=22) (actual time=0.009..0.011 rows=2 loops=1)
Recheck Cond: (age > 30)
Heap Blocks: exact=1
-> Bitmap Index Scan on idx_fgedu_employee_age (cost=0.00..4.29 rows=10 width=0) (actual time=0.007..0.007 rows=2 loops=1)
Index Cond: (age > 30)
Planning Time: 0.030 ms
Execution Time: 0.018 ms
(7 rows)
Part05-风哥经验总结与分享
5.1 性能优化最佳实践
- 系统级优化:
- 选择合适的硬件配置
- 优化操作系统参数
- 配置网络环境
- 数据库级优化:
- 合理配置数据库参数
- 优化存储结构
- 设计合理的索引
- 定期维护数据库
- SQL级优化:
- 优化SQL语句
- 分析查询计划
- 使用索引
- 避免全表扫描
- 应用级优化:
- 使用缓存
- 优化连接池
- 代码优化
5.2 常见性能问题与解决方案
常见性能问题及解决方法
- 问题1:查询速度慢
- 症状:SQL查询执行时间长
- 解决方案:优化SQL语句;创建索引;分析表统计信息
- 问题2:系统负载高
- 症状:CPU或内存使用率高
- 解决方案:优化SQL语句;调整数据库参数;增加硬件资源
- 问题3:磁盘I/O高
- 症状:磁盘I/O使用率高
- 解决方案:使用SSD;优化存储结构;减少I/O操作
- 问题4:锁争用
- 症状:事务等待时间长
- 解决方案:优化锁策略;减少事务长度;使用合适的隔离级别
- 问题5:内存不足
- 症状:内存使用率高,出现交换
- 解决方案:增加内存;优化内存使用;调整数据库参数
5.3 性能监控与调优技巧
- 监控工具:
- 使用top、iostat、netstat等系统工具
- 使用openGauss自带的监控工具
- 使用第三方监控工具
- 监控指标:
- CPU使用率
- 内存使用率
- 磁盘I/O
- 网络流量
- 数据库连接数
- 查询执行时间
- 调优技巧:
- 定期分析查询计划
- 定期更新统计信息
- 定期重建索引
- 定期清理垃圾数据
- 使用分区表
- 使用缓存
- 调优流程:
- 识别性能瓶颈
- 分析问题原因
- 制定优化方案
- 实施优化
- 验证优化效果
- 监控系统性能
风哥提示:性能优化是一个持续的过程,需要定期监控和调优,以确保系统的性能能够满足业务需求。在优化过程中,应该从系统、数据库和SQL等多个层面进行综合考虑,找出性能瓶颈并采取相应的优化措施。
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
