系统性能调优必知必会

CPU缓存

  1. CPU多级缓存,单核心会有自己的一级二级缓存,所有核心会共享三级缓存
  2. 一级缓存包括数据缓存 、指令缓存。
  3. 数据的读取是以缓存行进行读取的,缓存行一般为64字节。
  4. 缓存行中数据变化会导致整个缓存行失效
  5. 缓存一致性协议(例如MESI协议)来使得缓存行在多核心缓存中保持一致

内存伪共享

  1. 无效变量填充例如Long 属性后紧跟7个Long的无效属性
  2. 使用sun的注解@Contended

性能优化

按顺序访问数据
即操作连续的内存,充分利用缓存行,提高读数据缓存的命中率
有规律的条件分支
例如数据线排序再进行处理,优势为利用指令缓存,提高读指令缓存的命中率
数据按缓存行的大小填充、对齐

通常缓存行为64字节
防止伪共享,提高并发处理能力和缓存命中率

对于多核处理器,如果缓存命中率很高,可以考虑进行CPU绑定的操作,防止多核心执行时持续进行内存读取
Linux系统可以使用Perf工具去验证缓存命中情况。yum install perf http://www.brendangregg.com/perf.html

内存池

例子:Java项目中,指定最大堆内存 -XX+Xmx = 8G 但是在近百个线程并发下,Java进程会占用到14G内存

业务代码和系统内核间往往有两层内存池

以linux中默认的Ptmalloc2内存池为例单线程下:当主进程下申请1字节内存时,内存池会预分配132字节内存。当主进程内存垃圾回收后,内存池132字节内存并不会进行归还,防止下一次主进程申请。多线程中:每个子线程预分配的内存是64MB即TALB,有100个线程则会被内存池占用6GB内存。但是有个限制,子线程内存池最多只能到8倍的CPU核心数。
应用层内存池
C库内存池
TCMalloc:对多线程下小内存分配友好。
Ptmalloc2:更擅长于大内存分配。基于假定,若A申请并释放了内存,则B也有可能进行类似的内存申请,即允许内存池在线程中复用来提升性能。但是每次内存分配都需要进行加锁才能解决共享资源共享问题。线程数越多,锁竞争概率越高。如何区分大小内存?
TCmalloc把内存分为3档,小于等于256KB的成为小内存,256~1M的为中等内存,大于1M的为大内存。因此,如果主要分配256KB以下内存,尤其是多线程环境下,应选用TCmalloc

内存分配

一般情况下(无JVM级参数设置等)
非使用new等关键字的内存申请发生在栈中
GO语言中new关键字根据分析上下文语义,会选择栈还是堆分配享元模式

索引

1、哈希桶选择素数,这个其实是有科学研究的。不同的数据规模选中不同的哈希桶大小,能够保证数据更均匀。
2、Reids中没有使用红黑树而是使用了跳表skiplist,因为shiplist支持区间查找。在数据量小的情况下会使用压缩数组
3、哈希算法在数据库的分库分表中也常用到,比如第一次计算哈希值找到对应的数据库。
4、在MySQL数据库中使用B+树做索引,是因为可以减少树的高度,同时也可以使磁盘IO加载按照页方式(一页4K)加载。这样尽可能的多加载到连续数据到内存进行处理。
5、位图bitmap其实在布隆过滤器中使用的比较多,主要是用于判断一个数据是否存在。核心思想就是内部有几个不同的哈希函数,映射到不同的bit位。如果同一个数据映射的这些bit位都有值,则可以认为该数据存在。即不存在的一定不存在。
6、哈希算法经过演化(优化)成一致性哈希算法,在分布式系统中节点故障时迁移数据影响范围比较小,其核心思想是两次哈希运算。

最快索引-哈希表

基于数组实现,可以根据下表随机访问任意元素。
数组之所以可以随机访问,是因为由连续的内存空间,且数组元素大小是一致的。那么访问数据所在地址就更快了
通过将查询关键字转化为数组下标。
即hash算法
hash变种-位图
是与否两种情况下,可以采用位图关系。如布隆过滤器等等,采用多重Hash算法,然后选择位图占用
hash冲突解决
链接法  hashMap
开放寻址法  ThreadLocalMap
降低hash冲突
选择好的hash函数 如1.7和1.8的hash函数优化
扩容

零拷贝-高效的传输文件

磁盘是主机中最慢的硬件之一,对其优化能获得立竿见影的效果。
磁盘优化技术:零拷贝、直接IO、异步IO等等

PageCache(磁盘高速缓存)

除了缓存外,内核(IO调度算法)会师徒缓存尽量多的了连续IO在PageCache中,
最后合并成一个更大的IO发送给磁盘,从而减少磁盘寻址操作;
内核也会预读后续的IO放在PageCache中。
磁盘会比读内存慢许多,所以就会将可能读取到的数据放入磁盘中

参考MySQL中的Buffer pool概念
分为change buffer(redo log部分)
但是其自己拥有pageCache

时间局部性原理

刚被访问到的数据,再次被访问的几率很高

LRU算法

淘汰最末访问的数据

磁盘预读

系统性能调优必知必会(脑图更新。。)相关推荐

  1. 性能调优之JMH必知必会1:什么是JMH

    性能调优之JMH必知必会1:什么是JMH JMH必知必会系列文章(持续更新) 一.前言 二.什么是JMH 1.JMH简介 2.JMH入门 3.使用JMH进行微基准测试 JMH必知必会系列文章(持续更新 ...

  2. 性能调优之JMH必知必会2:JMH的基本用法

    性能调优之JMH必知必会2:JMH的基本用法 JMH必知必会系列文章(持续更新) 一.前言 二.JMH的基本用法 1.添加JMH依赖包 2.@Benchmark 2.@Warmup和@Measurem ...

  3. 脑残式网络编程入门(三):HTTP协议必知必会的一些知识

    为什么80%的码农都做不了架构师?>>>    本文原作者:"竹千代",原文由"玉刚说"写作平台提供写作赞助,原文版权归"玉刚说&q ...

  4. Android 性能优化必知必会(2020-5-16)

    做了这么久性能相关的工作,也接触了不少模块,说实话要做好性能这一块,真心不容易.为什么这么说? 是因为需要接触的知识实在是太多了, Android 是一个整体,牵一发而动全身,不是说只懂一个模块就可以 ...

  5. Oracle Database 11g数据库管理艺术(涵盖DBA必知必会的所有数据库管理知识)

    Oracle Database 11g数据库管理艺术(涵盖DBA必知必会的所有数据库管理知识) 基本信息 原书名: Expert Oracle Database 11g Administration ...

  6. Java架构师必知必会,带走不谢

    可以说,Java是现阶段中国互联网公司中,覆盖度最广的研发语言,掌握了Java技术体系,不管在成熟的大公司,快速发展的公司,还是创业阶段的公司,都能有立足之地. 成为Java架构师,需要掌握哪些技能呢 ...

  7. Python 程序员必知必会的开发者工具

    Python 程序员必知必会的开发者工具 Python已经演化出了一个广泛的生态系统,该生态系统能够让Python程序员的生活变得更加简单,减少他们重复造轮的工作.同样的理念也适用于工具开发者的工作, ...

  8. 从《MySQL必知必会》中对MySQL的理解

    MySQL是一个开源的DBMS,是目前主流的关系型数据库DBMS之一.在<MySQL必知必会>中,作者通过简单实用的订单实例简而明要地介绍了MySQL,这里简单汇总. 查询 检索+过滤+排 ...

  9. SQL必知必会-进阶篇[SQL学习笔记]

    本篇博客是对于陈旸老师极客专栏"SQL 必知必会"进阶篇的笔记总结.需要学习资料可私信. 文章目录 第20课 数据库优化 第21课 数据库的设计范式都有哪些? 数据表的键都有哪些? ...

最新文章

  1. 1112 Stucked Keyboard (20 分)【难度: 一般 / 知识点: 模拟】
  2. 【转】 python socket向百度发送http长连接请求 并做搜索
  3. 4.6 计算机网络之网络层IP组播(IGMP、组播路由选择协议、组播地址)
  4. 万能高品质PSD分层促销海报,电商美工必备
  5. 使用寻路算法写的一个小项目
  6. 基于simulink的模糊PID控制器设计与实现
  7. Assembler - Debug
  8. 旋转卡(qia)壳 平面最远点对
  9. Java之OutOfMemoryError简单分析
  10. C语言中对字符串的加密和解密
  11. 基于百度飞桨的单/多镜头行人追踪(非官方Baseline)
  12. EMC防护中的滤波电容-为什么放0.1uF和0.01uF电容
  13. 微信文件上传的测试用例
  14. 什么是线程?线程的优缺点和使用场景。
  15. FIFO就是 first in first out 先进先出
  16. SAP HANA:下一代开放应用平台
  17. 2021_SIGIR_Social Recommendation with Implicit Social Influence
  18. 现代通信原理1:绪论
  19. 社招国企八成是坑,都是关系户看不上的岗位!压力大,薪资低,考核严,程序员地位最低!...
  20. DM3730应用程序自启动解决方案

热门文章

  1. Apache Hudi数据湖的Cleaning服务
  2. java计算机毕业设计健身俱乐部业务关系系统源码+mysql数据库+系统+lw文档+部署
  3. 测试硬件工程师——第一天(万用表)
  4. 2023全新彩虹晴天多功能系统源码 知识付费系统 虚拟商城系统 完美可用
  5. Docker实践:python应用容器化
  6. 导入 Excel 未在本地计算机上注册“microsoft.ACE.oledb.12.0”提供程序解决办法
  7. 解决Chrome使用截图插件时,不能截本地的HTML
  8. 怎么通过id选择器将按钮隐藏
  9. 开源PLog库的使用
  10. 出现:“resize.cpp:4044: error: (-215) ssize.width 0 ssize.height 0 in function cv::resize ”的问题之一