MySQL之优化服务器设置(五)

优化服务器设置

高级InnoDB设置

innodb_old_blocks_time

InnoDB有两段缓冲池LRU(最近最少使用)链表,设计目的是防止换出长期很多次的页面。像mysqldump产生的这种一次性的(大)查询,通常会读取页面到缓冲池的LRU列表,从中读取需要的行,然后移动到下一页。理论上,两段LRU链表将阻止此页取代很长一段时间内都需要用到的页面被放入"年轻(Young)"子链表,并且只在它被已被浏览过多次后将其移动到"年老(Old)"子链表。但是InnoDB默认没有配置为防止这种情况,因为页内有很多行,所以从页面读取的行的多次访问,会导致它立即被转移到"年老(Old)"子链表,对哪些需要长时间缓存的页面带来换出的压力。这个变量指定一个页面从LRU链表的"年轻"部分转移到"年老"部分之前必须经过的毫秒数。默认情况下将它设置为0,将它设为诸如1000毫秒(一秒)这样的小一点的值,在基准测试中已被证明非常有效。

线程

MySQL每个连接使用一个线程,另外还有一个内部处理线程、特殊用途的线程,以及所有存储引擎创建的线程。在MySQL5.5中,Oracle提供了一个线程池插件,但目前尚不清楚在实际应用中能获得什么好处。无论哪种方式,MySQL都需要大量的线程才能有效地工作。MySQL确实需要内核级线程地支持,而不只是用户级线程,这样才能更有效地使用多个CPU.另外也需要有效的同步原子,例如互斥变量。操作系统的线程库必须提供所有的这些功能。
GNU/Linux提供两个线程库:LinuxThreads和新的原生POSIX线程库(NPTL).LinuxThreads在某些情况下仍然使用,但现在的发行版已经切换到NPTL,并且大部分应用已经不再加载LinuxThreads.NPTL更轻量,更高效,也不会有哪些LinuxThreads遇到的问题。
FreeBSD会加载许多线程库。从历史上看,它对县城的支持很弱,但现在已经宾得好多了,在一些测试中,甚至由于SMP系统上的GNU/Linux。在FreeBSD6和更新版本,土建的线程库是libthr,早期版本使用的linuxthreads,是FreeBSD从GNU/Linux上一致的Linux/Threads库。
通常,线程问题都是过去的事了,现在GNU/Linux和FreeBSD都提供了很好的线程库,Solaris和Windows一直对线程有很好的支持,尽管直到5.5发布之前,MyISAM都不能在Windows下很好地使用线程,但5.5里有显著的提升

内存交换区

在这里插入图片描述在这里插入图片描述
在这里插入图片描述

当操作系统因为没有足够的内存而将一些虚拟内存写到磁盘就会发生内存交换(内存交换有时称为页面交换,从技术上来说,它们是不同的东西,但是人么你通常把它们作为同义词)内存交换对操作系统中运行的进程是透明的。只有操作系统知道特定的虚拟内存地址是在物理内存还是硬盘。
内存交换对MySQL性能影响是很糟糕的,它破坏了缓存在内存的目的,并且相对于使用很小的内存做缓存,使用交换区的性能更差。MySQL和存储引擎有很多算法来区别对待内存中的数据和硬盘上的数据,因为一般都假设内存数据访问代价更低。
因为内存交换对用户进程不可见,MySQL(或存储引擎)并不知道数据实际上已经移动到磁盘,还会以为在内存中。
结果会导致很差的性能。例如,若存储引擎认为数据依然在内存,可能觉得为"短暂"的内存操作锁定一个全局互斥变量(例如InnoDB缓冲池Mutex)是OK的。如果这个操作实际上引起了硬盘IO,直到IO操作完成前任何操作都会被挂起。这意味着内存交换比直接做硬盘IO操作还要糟糕。
在GNU/Linux上,可以用vmstat来监控内存交换。最好查看si和so列报告的内存交换IO活动,这比看swap列报告的交换区利用率更重要。swapd列可以展示那些被载入了但是没有被使用的进程,它们并不是真的会称为问题。我们喜欢si和so列的值为0,并且一定要保证它们低于每秒10个块。
极端的场景下,太多的内存交换可能导致操作系统交换空间溢出。如果发生了这种情况,缺乏虚拟内存可能让MySQL崩溃。但是即使交换空间没有移除,非常活跃的内存交换也会导致整个操作变得无法响应,到这种时候甚至不能登录系统去杀掉MySQL进程。有时当交换空间溢出时,甚至Linux内核都会完全Hang住。绝不要让系统的虚拟内存溢出!对交换空间利用率做好监控和报警。如果不知道需要多少交换空间,就在硬盘上尽可能多地分配空间,这不会对性能造成冲击,只是消耗了硬盘空间。有些大的组织清楚地直到内存消耗将有多大,并且内存交换被非常严格地控制,但是对于只有少量多用途的MySQL实例,并且工作负载页多种多样的环境,通常不切实际。如果后者的描述更符合实际情况,确认给服务器一些"呼吸"的空间,分配足够的交换空间。
在特别大的内存压力下经常发生的另一件事是内存不足(OOM),这会导致踢掉和杀掉一些进程。在MySQ进程这很常见。在另外的进程上也挺常见,比如SSH,甚至会让系统不能从网络访问。可以通过设置SSH进程的oom_adj或oom_score_adj值来避免这种情况。
可以通过正确地配置MySQL缓冲来解决大部分内存交换问题,但是有时候操作系统的虚拟内存系统还是会决定交换MySQL的内存。这通常发生在操作系统看到MySQL发出了大量的IO,因此尝试增加文件缓存来保存更多数据时。如果没有足够的内存,有些东西就必须交换出去,有些可能就是MySQL本身。有些老的Linux内核版本也有一些适得其反鞥多优先级,导致本不应该被交换的被交换出去,但是在最近的内核都被缓解了。
有些人主张完全禁用交换文件。尽管这样做有时在某些内核拒绝工作的极端场景下是可行的,但这降低了操作系统的性能(在理论上不会,但是实际上会的)。同时这样做也是很危险的,因为禁用内存交换就相当于给虚拟内存设置了一个不可动摇的限制。如果MySQL需要临时使用很大一块内存,或者有很耗内存的进程运行在同一台机器(如夜间批量任务),MySQL会内存溢出、崩溃或者被操作系统杀死。
操作系统通常允许对虚拟内存和IO进行一些限制。我们提供过一些GNU/Linux上控制它们的办法。最基本的办法是修改/proc/sys/vm/swappiness为一个很小的值,例如0或1.这告诉内核除非虚拟内存完全满了,否则不要使用交换区。下面如何检查这个值的例子。这个值显示为0,这是默认的设置(范围是0~100),如果它不是0,则对服务器而言这是一个跟糟糕的默认值,服务器应该设置为0:

另一个选项是修改存储引擎怎么读取和写入数据。例如,使用innodb_flush_method=0_DIRECT,减轻IO压力,DirectIO并不缓存,因此操作系统并不能把MySQL视为增加文件缓存的原因。这个参数只对InnoDB有效。你也可以使用大页,不参与换入换出。这对MyISAM和InnoDB都有效。
另一个选择是使用MySQL的memlock配置项,可以把MySQL锁定在内存。这可以避免交换,但是也可能带来危险:如果没有足够的可锁定内存,MySQL在尝试分配更多内存时会崩溃。这也可能导致锁定的内存太多而没有足够的内存留给操作系统。很多技巧都是对于特定内核版本的,因此要小心,尤其是当升级的时候。在某些工作负载下,很难让操作系统的行为合情合理,并且仅有的资源可能让缓冲大小达不到最满意的值

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/355816.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【对抗去偏】BiasAdv: Bias-Adversarial Augmentation for Model Debiasing

原文标题: BiasAdv: Bias-Adversarial Augmentation for Model Debiasing 原文代码: 暂无 发布年度: 2023 发布期刊: CVPR 摘要 Neural networks are often prone to bias toward spurious correlations inherent in a dataset, …

苹果手机短信删除了怎么恢复?有那些方法?

IPhone短信删除怎么恢复?现在大多数人都会使用社交软件沟通交流,短信的用武之地已经没以前那么多,但是它的重要性一点都不能忽视,有些重要的短信内容值得我们保留,如果不小心删除了这些短信内容该怎么恢复?…

摊牌了,我不装了~各种Amazon Bedrock小样儿、试用装,今天免费!

探索世界顶级的大模型、智能体、文生图、对话机器人……新手?还是专家?加入我们,解锁精彩内容: l 初体验:在 Amazon Bedrock Playground 直接调用强大的大模型,点亮生成式AI技能树。 l 文生图&#xff1a…

Android系统 抓trace方法(手机及车机)

1、先说说什么是trace trace是一种以perfetto.trace结尾的文件。一般用来分析卡顿、启动时间慢等问题,还可以用来分析方法耗时,android系统的性能、功耗等等问题。所需要使用到的网站是: Perfetto UI 他的前身是Systrace,不过Pe…

探索图神经网络(GNN):使用Python实现你的GNN模型

一、引言 图神经网络(Graph Neural Network, GNN)作为近年来机器学习和深度学习领域的热门话题,正逐渐吸引越来越多的研究者和开发者的关注。GNN能够处理图结构数据,在社交网络分析、推荐系统、化学分子结构预测等领域有着广泛的…

二本(三本)毕业、4年职场牛马----分享给计科专业男女孩或被迷茫、焦虑困扰的大学生们的一些感悟

背景 我不是一个贩卖焦虑的博主,博主二本(三本升上来)毕业,当年正逢2020疫情,一战考研失败,家里蹲到没有实习。靠关系进第一家公司做Python后端,然后第一家公司因为疫情黄了。二战考研又失败&a…

eNSP学习——OSPF在帧中继网络中的配置

目录 主要命令 原理概述 实验目的 实验场景 实验拓扑 实验编址 实验步骤 1、基本配置 2、在帧中继上搭建OSPF网络 主要命令 //检查帧中继的虚电路状态 display fr pvc-info//检查帧中继的映射表 display fr map-info//手工指定OSPF邻居,采用单播方式发送报文 [R1]os…

课程管理系统

摘 要 在大学里,课程管理是一件非常重要的工作,教学工作人员每天都要与海量的数据和信息打交道。确保数据的精确度和完整程度,影响着每一位同学的学习、生活和各种活动的正常展开,更合理的信息管理也为高校工作的正规化运行和规范…

QThread 与QObject::moveToThread在UI中的应用

1. QThread的两种用法 第一种用法就是继承QThread,然后覆写 virtual void run(), 这种用法的缺点是不能利用信号槽机制。 第二种用法就是创建一个线程,创建一个对象,再将对象moveToThread, 这种可以充分利用信号槽机制&#xff…

Docker:Harbor

目录 一、Harbor介绍 二、安装 Harbor 2.1 环境准备 2.2下载 Harbor 3.3 修改配置(可选) 3.4 启动 Harbor 3.5访问 Harbor 三、使用 Harbor 3.1 管理Harbor 一、Harbor介绍 Docker Harbor 是由 VMware 公司开源的一款企业级的 Docker Registry …

基于JSP技术的个性化影片推荐系统

开头语:你好呀,我是计算机学长猫哥!如果有相关需求,文末可以找到我的联系方式。 开发语言:Java 数据库:MySQL 技术:JSPServlet 工具:MyEclipse、Tomcat、MySQL 系统展示 首页 …

kafka的基本模型

kafka官网 线程和线程之间的数据交互 在jvm里不同的线程有自己的栈内存,但彼此之间交互可以在共享的内存中进行,即堆内存,堆内存会将这些消息放到队列中,具体实现jvm见,栈内存各自维护,堆内存大家共享 进…

DLS平台:美联储松绑预期升温,金价飙升至2365美元

摘要 美联储鹰派官员古尔斯比对降息态度有所松动,导致金价一度升至2365美元。市场对美联储未来的货币政策预期有所改变,黄金作为避险资产的吸引力增强。本文将详细分析美联储官员态度变化对金价的影响、当前市场对黄金的预期及其未来走势。 美联储官员态…

Pyqt QCustomPlot 简介、安装与实用代码示例(二)

目录 前言实用代码示例彩色图演示散点像素图演示实时数据演示多轴演示对数轴演示 结语 所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 nixgnauhcuy’s blog! 如需转载,请标明出处! 完整代码我已经上传到…

第 402 场 LeetCode 周赛题解

A 构成整天的下标对数目 I 计数&#xff1a;遍历 h o u r s hours hours &#xff0c;记录 h o u r s [ i ] % 24 hours[i]\%24 hours[i]%24 的出现次数 class Solution {public:long long countCompleteDayPairs(vector<int>& hours) {vector<int> cnt(24);…

【小白专用 已验证24.6.18】C# SqlSugar操作MySQL数据库实现增删改查

【小白专用24.6.18】C# SqlSugar&#xff1a;连接数据库实现简单的&#xff0c;增、删、改、查-CSDN博客 SqlSugar .Net ORM 5.X 官网 、文档、教程 - SqlSugar 5x - .NET果糖网 SqlSugar项目创建 通过NuGet包管理器搜索SqlSugar&#xff08;MySql还要安装MySql.Data、Newton…

如何计算 GPT 的 Tokens 数量?

基本介绍 随着人工智能大模型技术的迅速发展&#xff0c;一种创新的计费模式正在逐渐普及&#xff0c;即以“令牌”&#xff08;Token&#xff09;作为衡量使用成本的单位。那么&#xff0c;究竟什么是Token呢&#xff1f; Token 是一种将自然语言文本转化为计算机可以理解的…

【Linux】进程信号2——阻塞信号,捕捉信号

1.阻塞信号 1.1. 信号其他相关常见概念 在开始内容之前&#xff0c;先介绍一些信号的专业名词&#xff1a; 实际执行信号的处理动作称为信号递达&#xff08;Delivery&#xff09;信号从产生到递达之间的状态&#xff0c;称为信号未决&#xff08;Pending&#xff09;&#…

【秋招刷题打卡】Day01-自定义排序

Day01-自定排序 前言 给大家推荐一下咱们的 陪伴打卡小屋 知识星球啦&#xff0c;详细介绍 >笔试刷题陪伴小屋-打卡赢价值丰厚奖励 < ⏰小屋将在每日上午发放打卡题目&#xff0c;包括&#xff1a; 一道该算法的模版题 (主要以力扣&#xff0c;牛客&#xff0c;acwin…

【Git】 -- Part1 -- 基础操作

1. Git简介 Git 是一个开源的分布式版本控制系统&#xff0c;由 Linus Torvalds 于 2005 年开发&#xff0c;主要用于源代码管理。Git 允许多名开发者共同合作处理同一个项目&#xff0c;跟踪每个文件的修改&#xff0c;并且在必要时回滚到之前的版本。 Linus Torvalds是Linux…