性能优化和体系化运维 ——唐成

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云原生数据库 PolarDB MySQL 版,Serverless 5000PCU 100GB
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介: 性能优化和体系化运维——唐成

内容简要:

一、操作系统优化

二、数据库配置优化

三、日常操作

四、运维方案

 

 

一、操作系统优化

操作系统优化主要从共享内存、参数设置、使用大页、信号量和Limit参数等方面阐述。

 

(一)共享内存

当用户使用PostgreSQL 9.3GreenPlum5及以前的版本,为防止数据库使用Swap,需先设置下面两个参数:

Ø  kernel.shmmax = 16724692992

Ø  kernel.shmall = 4083177

PostgreSQL 9.3开始,数据库不再大量使用Sysv类型的共享内存,主要使用MMAP类型的共享内存,因此上面两个参数设置一个较小的值,数据库也可以启动。

 

(二)参数设置

1.   vm.swappiness=0

在数据库中需尽量避免使用Swap,因此将该参数值设置为0

2.   Overcommit参数

通常情况下设置vm.overcommit_memory=2,即不让系统超申请。通常情况下该值为0,表示申请的内存可以超过物理机内存。当大家都开始使用的时候,则会发生OOM,将一些进程给Cut掉,这在数据库中是比较危险的情况,因此建议将vm.overcommit_memory设为2

除此之外,需要设置vm.overcommit_ratio= 90,需要根据实际情况设置。

当设置完这两个值后,可以申请的内存不超过:

swap的大小 + 物理内存* vm.overcommit_ratio

例如:一个256G内存的机器,16G Swap,应该把vm.overcommit_ratio= 93,这样256*95%+16=254G,内存申请不可超过254G,如果超过的话则申请失败。

 

(三)大页

1.为什么要使用大页

使用大页是因为页表问题的存在,使用小页会存在页表占用过多内存的问题。

假设一台256G的机器,我们分配了共享内存为128G。如果是小页,大小为4K,则有33554432页表项,每项至少占用4字节,则页表大小32M*4=128M,如果有1024个连接,则页表占用128M*1024=128G内存,占据机器总内存的一半。

如果使用2M大小的大页表,则:则有128G/2M=65536项,65536*4=256K1024个连接:1024*256k=256M内存,内存占用率大幅降低。

通常在 Linux操作系统里面,建议使用大页。

 

2.大页配置

大页参数设置:vm.nr_hugepages

这个参数设置的值为多少,则有对应数量的2M大页。大页的大小需要与数据库的Shared_buffer相一致,如果比Shared_buffer大很多则会浪费资源。

大页不会被Swap,默认Lock,即类似Oraclelock_sga,且分配大页内存后,及时不使用大页,也不可做其他用途。

 

(四)信号量

PostgreSQL数据库是多进程数据库,进程和进程之间访问同一个共享内存时,需要各种各样的“锁”机制,通常信号量指的就是进程之间的“锁”。需要设置kernel.sem=20 13000 20 650,参数的4个数据对应:SEMMSLSEMMNSSEMOPMSEMMNI

l  SEMMSL:信号集的最大信号量数,PostgreSQL要求大于17,取整数20Oracle要求是250

l  SEMMNS整个系统范围内的最大信号量数,所以SEMMNS = SEMMSL *SEMMNI

l  SEMOPMSemop函数在一次调用中所能操作一个信号量集中最大的信号量数,所以能常与SEMMSL相同。

l  SEMMNI信号量集的最大数目,PostgreSQL数据库中要求是数据库进程数/16,假设允许10000个连接,即需要至少625,取一个整数650。这个进程数不只是用户服务进程,还需要包括一些管理的服务进程,如AutovacuumWork进程。

 

(五)Limit参数

1./etc/security/limits.conf(软/硬限制一样):

Ø  soft nofile 65536

Ø  hard nofile 65536(打开文件的值)

Ø  soft nproc 131072

Ø  hard nproc 131072(进程数)

Ø  soft memlock -1

Ø  hard memlock -1 (内存)

 

2./etc/security/limits.d/20-nproc.conf

Ø  soft nproc 131072

当设置了“/etc/security/limits.d/20-nproc.conf”时,参数有时候不一定生效,因为在不同的机器中可能还有个Limits.d,下面有个配置文件优先级比limits.d/20-nproc.conf高,有些机器不一定是20,可能是其他的值。此时要将值设高一些,然后检查底下limits.d下面这篇文件中是否设置,如果没有则要把这个值设高,如果设低的话,limits.d.conf里设高也没有用。

 

 

二、数据库配置优化

数据库主要包含以下几个参数:

l  Shared_buffer

1)小内存(32G)的机器上配置4GB~8GB即可;

2)小内存的机器(>32G),配置8GB即可。

通常Shared_buffer配置4GB~8GB即可。PostgreSQL是使用这个文件缓存做的,如果Shared_buffer设大,缓存有两份。

 

l  Work_mem

1)通常保持默认的4MB即可;

2)如果机器内存很多,可以设置为64MB,通常不要太大,防止发生OOM

 

l  Maintenance_work_mem:

可以在Session级别设置,当手工建索引或Vacuum慢时,可以把这个参数在Session级别调大。

 

l  Wal_buffers

通常保持默认值-1即可,-1表示会自动根据shared_buffer的大小而自动设置一个合适的大小,最大不要超过WAL文件的大小,如16MB

 

l  Max_connections

可以设置的大一些,如5000,因为修改这个参数需要重启机器。

 

时间上还有很多的其他参数,如一些超时参数,防止长时间发呆的连接,防止长时间发呆的事务等,具体详情可关注PostgreSQL中文社区的培训认证考试PCAPCPPCM

 

 

三、日常操作

数据库日常操作及对应语句:

l  查看数据库版本

select version();

l  查看数据库的启动时间

select pg_postmaster_start_time();

l  查看最后load配置文件的时间

select pg_conf_load_time();

l  显示数据库时区

show timezone;

l  查看有哪些数据库

psql –l

l  查看当前用户

select user; select current_user, session_user;

current_user, session_user指不带括号的函数。

l  查看当前连接的数据库名称

select current_catalog, current_database ();

l  查看当前客户端的IP及端口

select inet_client_addr(), inet_client_port();

l  查看当前数据库服务器的IP及端口

select inet_server_addr(), inet_server_port();

l  查询当前session的后台服务进程的pid

select pg_backend_pid();

l  查看参数配置

1show shared_buffers

2select current_setting('shared_buffers');

l  查看当前正在写的WAL文件

19.X: select pg_xlogfile_name(pg_current_xlog_location());

2>=10版本: select pg_walfile_name(pg_current_wal_lsn ());

l  查看当前WALbuffer还有多少字节没有刷到磁盘中

9.X:selectpg_xlog_location_diff(pg_current_xlog_insert_location(), pg_current_xlog_location());

>=10版本: : select pg_wal_lsn_diff(pg_current_wal_insert_lsn (), pg_current_wal_lsn ());

l  查看数据库实例是否正在做基础备份

select pg_is_in_backup(), pg_backup_start_time() ;

l  当前数据库实例是Hot Standby状态还是正常数据库状态

1select pg_is_in_recovery();

如果是备库显示true,否则是主库。

2pg_controldata |grep state

指控制文件,在生产情况“in production”情况下是主库,在恢复状态下是备库。

l  查看数据库的大小

select pg_database_size('osdba')

l  查看表的大小

1select pg_size_pretty(pg_relation_size('ipdb2')) ;

2select pg_size_pretty(pg_total_relation_size('ipdb2')) ;

l  查看某个表上索引的大小

1select pg_size_pretty(pg_indexes_size('ipdb2'));

2)“ipdb2”指表名。

l  查看表空间的大小

1select pg_size_pretty(pg_tablespace_size('pg_global'));

2select pg_size_pretty(pg_tablespace_size('pg_default'));

l  查看表对应的数据文件

select pg_relation_filepath('test01');

l  让配置生效

1pg_ctl reload

2select pg_reload_conf();

l  切换Log日志文件

select pg_rotate_logfile();

l  切换WAL日志文件

19.x: select pg_switch_xlog();

2>=10版本: select pg_switch_wal();

l  手工产生checkpoint

checkpoint;

l  查询正在运行的SQL(也能看到等待事件)

select * from pg_stat_activity;

l  取消一个长时间运行的查询SQL(非DML

select pg_cancel_backend(pid);

l  终止一个进行运行的SQL(包括DML)

select pg_terminate_backend(pid);

l  杀掉除自己之外的连接(危险)

Select usename,datname, client_addr, pg_terminate_backend(pid) from pg_stat_activity where pid<> pg_backend_pid();

l  查看备库

select * from pg_stat_replication;

l  暂停备库的wal日志应用

select pg_xlog_replay_pause();

l  继续备库的wal日志应用

pg_xlog_replay_resume();

l  检查备库的wal日志应用是否暂停了

pg_is_xlog_replay_paused();

 

 

四、运维方案

(一)制定运维整体方案

制定完善运维整体方案,包括运维环境监控、日常数据库管理、数据库备份与恢复、性能监控、性能调优。

运维环境监控:包括CPU是否过高、IO是否过忙、网络监控(网络流量是否过大)、磁盘空间监控、数据库年龄监控(如果数据年龄超了,数据库会停止工作)、表和物化视图上索引的数量、数据库级的统计信息。

日常数据库管理:包括实例状态检查、PG监听是否正常、WAL日志检查(是否出现爆增还爆减)、表空间检查、日志检查(是否报错)、备份有效性检查的方法。

数据库备份与恢复:包括备份策略设定、物理备份、逻辑备份(库表小做逻辑备份)、备份脚本、恢复脚本或恢复操作过程、如何防止误删除(是否架建延持备库)。

性能监控:包括检查等待事件、磁盘IO监控、TOP 10 SQL、数据库的每秒查询的行、插入的行、删除的行、更新的行。

性能调优:包括OS层面优化、PG参数优化、SQL优化、IO优化、架构优化:如读写分离、分库分表。

上述工作都需要提前做好,以保证后续正常运维。

 

(二)运维的工作

日常运维工作包括:

• 表、索引、物化视图、数据库、表空间的大小,表空间剩余可用空间;

• 数据库年龄、表的年龄;

• 表,物化视图的索引数量;

• 索引扫描次数;

• 表、物化视图、索引膨胀字节数,膨胀比例;

Deadtuple

• 序列剩余次数;

HA,备份,归档,备库延迟状态;

• 错误日志统计;

• 事件触发器、触发器的情况;

Unlogged table的情况,如果是9.X版本之前,了解Hash Index情况;

• 锁等待;

• 活跃度,Active, Idle, Idle in transaction状态会话数,剩余可用连接数;

• 带事务号的长事务,2PC事务;

• 网卡利用率,CPU利用率,IO利用率,内存利用率;

• 慢SQL及当时的Analyze执行计划;

TOP SQL

• 数据库级别统计信息:回滚数,提交数,命中率,死锁次数,IO TIMETuple DML次数。

 

相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
相关文章
|
5天前
|
运维 监控 Kubernetes
构建高效稳定的云基础设施:自动化运维在企业级应用中的关键实践Kubernetes集群监控与性能优化策略
【5月更文挑战第27天】 随着云计算技术的不断成熟和企业数字化转型的深入,构建一个高效、稳定且可扩展的云基础设施已成为众多组织的核心诉求。本文将重点探讨自动化运维在实现这一目标中的重要作用,通过案例分析展示自动化工具和策略如何优化资源管理、提升服务响应速度以及降低运营成本。文章还将讨论自动化过程中面临的挑战,如安全性、复杂性管理和人员技能提升,并提供针对性的解决方案。
|
10月前
|
域名解析 缓存 运维
【运维知识进阶篇】集群架构-Nginx性能优化 (二)
【运维知识进阶篇】集群架构-Nginx性能优化 (二)
117 0
|
10月前
|
缓存 运维 网络协议
【运维知识进阶篇】集群架构-Nginx性能优化 (一)
【运维知识进阶篇】集群架构-Nginx性能优化
160 0
|
存储 JSON 自然语言处理
【大数据开发运维解决方案】ElasticSearc写入查询性能优化总结
ES(ElasticSearch) 我们需要根据公司要求,进行偏向性的优化。1、bulk批量写入2、多线程写入3、修改索引刷新时间4、修改merge参数以及线程数6、index buffer7、磁盘间的任务均衡8、Mapping优化8.1、自动生成docID(避免ES对自定义ID验证的操作) 8.2、调整字段Mapping 8.3、调整_source字段 8.4、禁用_all 8.5、禁用Norms 8.6、index_options设置 9、优化存储
【大数据开发运维解决方案】ElasticSearc写入查询性能优化总结
|
缓存 运维 网络协议
PostgreSQL 性能优化和体系化运维(一)|学习笔记
快速学习 PostgreSQL 性能优化和体系化运维(一)
349 0
|
存储 SQL 运维
Oracle数据库系统管理与运维 | Oracle体系结构与性能优化
Oracle数据库系统管理与运维 | Oracle体系结构与性能优化
200 0
Oracle数据库系统管理与运维 | Oracle体系结构与性能优化
|
运维
|
运维 NoSQL 数据处理
Neo4j 企业版和系统运维性能优化
Neo4j 企业版和系统运维性能优化
129 0
|
运维 监控 Cloud Native
干货|后互联网时代,运维工程师的必备性能优化指北
在竞争激烈的后互联网时代,深度挖掘每份流量背后的商业价值成为每个企业的必修课,而网站性能与体验的优化是这一过程中重要环节。 因此,《网站性能与体验优化指北》成为后互联网时代的网站运维的必备电子书。
|
12天前
|
运维 关系型数据库 MySQL
day03-Linux运维-Xshell优化和Linux系统命令入门(2)
day03-Linux运维-Xshell优化和Linux系统命令入门(2)
day03-Linux运维-Xshell优化和Linux系统命令入门(2)