CPU调优基础概念

缓存

关于内存的buffer和cahce,在面试的时候经常被问到buffer和cache的区别,其实我认为它们的区别并不重要,而是要问buffer和cache是哪里来的?IO在调用各种文件时候产生的,比如一个java程序想要调用一个文件,java程序是用户空间的程序,是没有权利调用硬盘上文件的,于是它要发起系统调用,让内核帮它调用硬盘上的文件,内核通过驱动先将文件调用到内存的内核空间,然后再由内核空间放到程序的用户空间当中的堆内存空间当中,这一段内存空间就可以被称之为buffer或cache。

cache如果被多次引用,内核会根据数据的局部性原理将这段数码永久停放在内存当中,让这段数据被不断命中,那么这就是缓存服务器的工作原理(varnish、nginx_cache)。

cpu也有缓存的概念,也是基于数据的局部性原理:指令缓存和数据缓存,当CPU执行一个程序的指令时会根据程序的局部性原理加载指令余下或周围的指令到一级、二级、三级缓存以提高执行的效率,数据缓存也是如此。

cpu的缓存至关重要,比频率还要重要,是提高CPU运行效率的最关键指标,企业级的CPU和家庭版的CPU在频率上相差并不是很多,但是在缓存上的差距就大了。

MMU

MMU是内存管理单元

进程在使用内存空间时并不是直接在真正的物理内存空间当中使用,内核本身就是一个虚拟化系统,它将内存虚拟化成线性地址空间,内核用线性地址空间给程序编织了一个“美梦”,让程序误认为它就运行在物理内存当中,在线性内存和物理内存之间存放着一个映射关系,保存这个映射关系的表就被称之为MMU,相当于目录。MMU表是bash计算过的,并不用全文检索,比较类似于字典,我们知道字典当中有几乎所有的汉字,但我们查到一个汉字的时候不能从字典的开头开始找起,而是以某种规则,比如我想找的汉字的拼音是某个字母开头的,那我们就直接翻到该字母所属的那一页,然后再根据第二个字母再一次减少检索范围,再根据第三个字母再减少范围,直到找到我们想查找的汉字,而MMU也是如此,数据库的索引也是如此,缓存当中的读写也这个原理,采用多级的方式,hash目录,提高检索效率。

TLB

TLB转换后援缓存器

如果第一个数据被频繁使用,可以将它的最终物理空间地址放到查询缓存当中,这样就不用再通过MMU查找了,TLB是CPU当中的一小段空间,我们无法增加,TLB的命中率越高越好,只不过他的空间非常小,比MMU更小,如果不够用就得用LRU算法进行清除了。

CPU进程切换

我们知道cpu是分时间片让不同的进程进行工作的,CPU也有缓存,一级缓存、二级缓存 、三级缓存,同时还是寄存器等等,如果一个进程一直在一个CPU上运行的话,那么上述这些部件当中保存的都是可以重复利用的,没用再重新加载。

假如是我们用2个cpu,默认每个进程都是可以在任何CPU上运行的,假设A进程第一次是在2号CPU上运行,下一次再运行时却被分配到了1号CPU上运行,正常运行当然是没有问题,但是A进程在2号CPU所缓存上的那些信息并不在1号CPU,需要1号CPU去2号CPU上取,这样一来,效率就降低了,如下图所示:

提高CPU的效率

加大页框大小

一个内存页框是4K大小,如果我们在让内核加大页框,增加到4M,这样的话MMU映射的页框数量虽然没变,但映射的内存空间却大了很多,这对很吃内存的程序非常有效,但有的进程不能使用大页,varnish就不支持。

减少刷写频率

刷写频率越少越好,因为硬盘的速度的确是太慢,让数据尽可能多的保存在内存当中,但是这么做也有一个坏处那就是如果一下子停电了,内存当中的数据都全丢了,要不拿空间换时间,要不拿时间换空间,自己根据自己的情况找一个平衡点即可。

提高物理内存的使用阀值

告诉内核只要物理内存还有剩于,就先不要使用swap

使用NUMA机制

NUMA机制就是隔离CPU,专进程专CPU。一般无需这么做,放到CPU性能调优最后一步,这已经属于极限压榨了,一般情况下不要使用。

进程绑定CPU

假如我们有一个WEB服务器,有8个CPU,我们我们拿出6个CPU,专门绑定nginx的6个worker进程,余下的2个CPU专门处理日常中断或其它进程像是sshd、网络服务这些,让nginx的woker进程专心运行在6个cpu上,不用切换下来,这就是NUMA机制。

我们可以使用ps –exo psr,pid、commd命令找到进程当前运行在哪一个CPU上,然后通过taskset –p –c <CPU-ID> <进程PID>的方式让进程绑定某一个CPU,当然这是临时生效,如果永久生效就得自己写脚本。

隔离CPU

如下所示,就将第2和第三个CPU隔离出来了,直接编辑grub.conf文件即可。

上是把cpu隔离出来,并不是隔离中断,想隔离中断,我们找到/proc/irq/中断号/目录,这个目录有一个文件smp_affinity这个文件里面记录了当前中断运行在哪一个CPU,我们可以可以通过echo改变里面的CPU编号,以达到专中断专CPU的目的,如果想达到专中断专CPU的目的就得把/proc/irq/中断号/目录里面所有的中断都修改成一样的CPU编号。

注意,尽量不要把0号CPU留给内核使用。

root@kk ~]# cat /proc/interrupts
CPU0
: IO-APIC-edge timer
: IO-APIC-edge i8042
: IO-APIC-edge rtc0
: IO-APIC-fasteoi acpi
: IO-APIC-edge i8042
: IO-APIC-edge ata_piix
: IO-APIC-edge ata_piix
: IO-APIC-fasteoi ehci_hcd:usb1, vmwgfx
: IO-APIC-fasteoi ioc0
中断编号 该处理的中断次数

NOTE:有关于CPU的调优用的最多的还是nice和renice

5、zabbix数据库分离的更多相关文章

  1. 自学Zabbix之路15.1 Zabbix数据库表结构简单解析-Hosts表、Hosts_groups表、Interface表

    点击返回:自学Zabbix之路 点击返回:自学Zabbix4.0之路 点击返回:自学zabbix集锦 自学Zabbix之路15.1 Zabbix数据库表结构简单解析-Hosts表.Hosts_grou ...

  2. MS SQL Server 数据库分离-SQL语句

    前言 今天在在清理数据库,是MS SQL Server,其中用到分离数据库文件.在这过程中,出现了一个小小的问题:误将数据库日志文件删除了,然后数据就打不开了,除了脱机,其他操作都报错. 数据库分离 ...

  3. zabbix数据库mariadb从服务器迁移到云mysql数据库的操作

    zabbix数据库mariadb从本机迁移到云mysql数据库的操作 1.将zabbix数据库导出,并导入到云数据库中 由于数据库较大,如果直接使用shell会话中断会导致数据库导出或者导入失败,使用 ...

  4. 15.5 自学Zabbix之路15.5 Zabbix数据库表结构简单解析-其他 表

    点击返回:自学Zabbix之路 自学Zabbix之路15.5 Zabbix数据库表结构简单解析-其他 表  1. Actions表 actions表记录了当触发器触发时,需要采用的动作. 2.Aler ...

  5. zabbix数据库分表的实现

    前提条件是主从同步操作完成(主从同步的前提是两个数据库表结构必须一样) 先看一下mysql配置文件 vi /usr/local/mysql/my.cnf 配置内容:------------------ ...

  6. 自学Zabbix之路15.2 Zabbix数据库表结构简单解析-Items表

    点击返回:自学Zabbix之路 点击返回:自学Zabbix4.0之路 点击返回:自学zabbix集锦 自学Zabbix之路15.2 Zabbix数据库表结构简单解析-Items表 Items表记录了i ...

  7. 自学Zabbix之路15.3 Zabbix数据库表结构简单解析-Triggers表、Applications表、 Mapplings表

    点击返回:自学Zabbix之路 点击返回:自学Zabbix4.0之路 点击返回:自学zabbix集锦 自学Zabbix之路15.3 Zabbix数据库表结构简单解析-Triggers表.Applica ...

  8. 自学Zabbix之路15.4 Zabbix数据库表结构简单解析-Expressions表、Media表、 Events表

    点击返回:自学Zabbix之路 点击返回:自学Zabbix4.0之路 点击返回:自学zabbix集锦 自学Zabbix之路15.4 Zabbix数据库表结构简单解析-Expressions表.Medi ...

  9. 自学Zabbix之路15.5 Zabbix数据库表结构简单解析-其他 表

    点击返回:自学Zabbix之路 点击返回:自学Zabbix4.0之路 点击返回:自学zabbix集锦 自学Zabbix之路15.5 Zabbix数据库表结构简单解析-其他 表  1. Actions表 ...

随机推荐

  1. AcWing 46. 二叉搜索树的后序遍历序列

    地址 https://www.acwing.com/solution/acwing/content/3959/ 题目描述输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果. 如果是则返回t ...

  2. LeetCode 1244. 力扣排行榜

    地址 https://www.acwing.com/solution/LeetCode/content/5765/ 题目描述新一轮的「力扣杯」编程大赛即将启动,为了动态显示参赛者的得分数据,需要设计一 ...

  3. openjdk源码下载

    http://hg.openjdk.java.net/jdk8u/jdk8u60/jdk/file/935758609767 browse>zip

  4. python中append的使用

    没有系统地学习过python,最近在append的使用上遇到了大问题,吃到了苦头 之前一直单纯地认为通过append把数添加到list中,不需要提前开空间,非常便利,但却没有意识到这个过程并不是值传递 ...

  5. 自己收集的好玩的JS特效(持续更新)

    放到我自己的服务器上了. 网 scale.html 樱花 sakura.html

  6. vscode源码分析【七】主进程启动消息通信服务

    第一篇: vscode源码分析[一]从源码运行vscode 第二篇:vscode源码分析[二]程序的启动逻辑,第一个窗口是如何创建的 第三篇:vscode源码分析[三]程序的启动逻辑,性能问题的追踪 ...

  7. golang--redis基本介绍

    redis(remote-dictionary-system)即远程字典服务器,是NoSQL数据库: 适合做缓存以及持久化: 免费开源,高性能的分布式内存数据库: redis的安装和使用: 下载Red ...

  8. ASP.NET ---- Repeater 遍历出省市

    Repeater  控件可以数据库中的数据,一条条的查找出,不需要后端在进行遍历输出了, Repeater必须使用的是Itemtemplate,其它的类型模板按需添加,主要记住Itemtemplate ...

  9. [03-2]VS2017 创建 ASP.NET Core Web 程序

    VS2017 创建 ASP.NET Core Web 程序 本文作者:梁桐铭- 微软最有价值专家(Microsoft MVP) 文章会随着版本进行更新,关注我获取最新版本 本文出自<从零开始学 ...

  10. c#中list集合使用Max()方法查找到最大值

    在C#的List集合操作中,有时候需要查找到List集合中的最大值,此时可以使用List集合的扩展方法Max方法,Max方法有2种形式,一种是不带任何参数的形式,适用于一些值类型变量的List集合,另 ...