![](https://img-blog.csdnimg.cn/20201014180756913.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
CPU篇
zhangyanfei01
欢迎关注个人公众号:开发内功修炼
展开
-
TLB缓存是个神马鬼,如何查看TLB miss?
介绍TLB之前,我们先来回顾一个操作系统里的基本概念,虚拟内存。虚拟内存在用户的视角里,每个进程都有自己独立的地址空间,A进程的4GB和B进程4GB是完全独立不相关的,他们看到的都是操作系统虚拟出来的地址空间。但是呢,虚拟地址最终还是要落在实际内存的物理地址上进行操作的。操作系统就会通过页表的机制来实现进程的虚拟地址到物理地址的翻译工作。其中每一页的大小都是固定的。这一段我不想介绍的太过于...原创 2019-08-24 15:49:03 · 7035 阅读 · 3 评论 -
带你深入理解内存对齐最底层原理
相信绝大多数的人都了解内存对齐,对齐后性能高。但是其最最底层的原理是啥呢? 有的人可能会说,因为高速缓存的工作机制。读者你很聪明,这是原因之一。但我今天想挖的是更底层一点的原理,让我们去内存的物理构成里找找答案!内存物理结构我们来了解一下内存的物理构造,一般内存的外形图片如下图: 图1 内存外形图一个内存是由若干个黑...原创 2019-09-21 09:27:48 · 466 阅读 · 0 评论 -
为什么内存为什么是以字节为单位的?
我觉得在冯诺依曼体系结构里,CPU和内存是最重要的设备。如果没有CPU和内存,服务器将完全无法运行。 所以继第一阶段分享完了CPU篇之后,今天就开始内存篇。我们以一个最简单的问题开篇,为什么内存地址0x0001和内存地址0x0002之间差的是一个byte,而不是一个bit?我想你对内存存储的计算已经熟练于心,a变量占用内存多少字节,b变量占用内存多少字节。但是你有没有深入思考过,为什么我们用的...原创 2019-09-18 08:12:59 · 6033 阅读 · 2 评论 -
函数调用太多了会有性能问题吗?
在现代的开发工作中,相信绝大部分的同学手头的项目都不是从第零行代码开始搭建的。各个语言都有自己流行的代码框架,如PHP的有Laravel、CodeIgniter、ThinkPHP等等。大家都是在自己的框架的基础上添加自己的业务代码逻辑,开启开发工作。还记得我们团队有位开发同学当时问过我一个问题,我们用xx框架这么重,一个用户请求过来即使什么也不干,都已经进行了那么多次的函数调用了,适合用来做接口...原创 2019-09-10 14:20:24 · 3506 阅读 · 1 评论 -
一次简单的redis请求会有哪些CPU开销?
我问大家一个问题,下图中一个最简单的例子,会导致哪些CPU开销产生?你是否能够说清楚?<?php ... $redis->get('test'); ...这个例子一下子就把大家在我的文章里学到的东西和你的实际工作结合起来了。怎么样,是不是足够简单?就是一句php代码从redis实例中获取一个key的value值而已,相信类似的代码你天天都在写。...原创 2019-09-02 20:27:23 · 403 阅读 · 0 评论 -
软中断竟然是可一个CPU使劲造?
一个奇怪的问题在了解了软中断对CPU的占用之后,如果你动手操作查看过的话,相信会和我一样会遇到下面这个的问题。如果没有实际遇到也没关系,你可以用hping命令制造一些网络接收包来观测。# hping3 -S -p 80 -i 你的服务器ip我当时对一台线上虚机查看软中断造成的CPU开销的时候,发现很奇怪,那就是所有的软中断几乎都是被一个CPU处理的。用top看si列,绝大部...原创 2019-08-31 20:16:48 · 648 阅读 · 0 评论 -
追踪将服务器CPU耗光的凶手!
前面我们讨论系统调用的时候结论是耗时200ns-15us不等。不过我今天说的我的这个遭遇可能会让你进一步认识系统调用的真正开销。在本节里你会看到一个耗时2.5ms的connect系统调用,注意是毫秒,相当于2500us!问题描述当时是我的一个线上云控接口,是nginx+lua写的。正常情况下,单虚机8核8G可以抗每秒2000左右的QPS,负载还比较健康。但是该服务近期开始出现一些500状态...原创 2019-08-29 19:15:30 · 475 阅读 · 0 评论 -
一次系统调用开销到底有多大?
首先说说系统调用是什么,当你的代码需要做IO操作(open、read、write)、或者是进行内存操作(mmpa、sbrk)、甚至是说要获取一个系统时间(gettimeofday),就需要通过系统调用来和内核进行交互。无论你的用户程序是用什么语言实现的,是php、c、java还是go,只要你是建立在Linux内核之上的,你就绕不开系统调用。图1.png大家可以通过strace命令来查看...原创 2019-08-28 19:58:25 · 1509 阅读 · 0 评论 -
协程究竟比线程能省多少开销?
前文中中我们用实验的方式验证了Linux进程和线程的上下文切换开销,大约是3-5us之间。这个开销确实不算大,但是海量互联网服务端和一般的计算机程序相比,特点是:高并发:每秒钟需要处理成千上万的用户请求 周期短:每个用户处理耗时越短越好,经常是ms级别的 高网络IO:经常需要从其它机器上进行网络IO、如Redis、Mysql等等 低计算:一般CPU密集型的计算操作并不多即使3-5us的...原创 2019-08-27 18:41:32 · 1516 阅读 · 2 评论 -
进程/线程上下文切换会用掉你多少CPU?
进程是操作系统的伟大发明之一,对应用程序屏蔽了CPU调度、内存管理等硬件细节,而抽象出一个进程的概念,让应用程序专心于实现自己的业务逻辑既可,而且在有限的CPU上可以“同时”进行许多个任务。但是它为用户带来方便的同时,也引入了一些额外的开销。如下图,在进程运行中间的时间里,虽然CPU也在忙于干活,但是却没有完成任何的用户工作,这就是进程机制带来的额外开销。图1.jpg在进程A切换到进程...原创 2019-08-26 09:53:45 · 2126 阅读 · 2 评论 -
你以为你的多核CPU都是真的吗?多核“假象”
提到CPU核数,相信绝大部分的同学想到的都是top命令,直接到自己的服务器上看一下是多少个核。看到的核越多,貌似笑的越开心。比如说说我的CPU,用top命令展开以后,看到了有24核。那么事实真是你想象的这么美好吗?# toptop - 17:04:51 up 882 days, 1:16, 1 user, load average: 0.05, 0.05, 0.00 Tasks:...原创 2019-08-22 10:51:39 · 282 阅读 · 0 评论 -
从DDR到DDR4,内存核心频率其实基本上就没太大的进步
从2001年DDR内存面世以来发展到2019年的今天,已经走过了DDR、DDR2、DDR3、DDR4四个大的规格时代了(DDR5现在也出来了)。内存的工作频率也从DDR时代的266MHz进化到了今天的3200MHz。这个频率在操作系统里叫Speed、在内存术语里叫等效频率、或干脆直接简称频率。这个频率越高,每秒钟内存IO的吞吐量越大。但其实内存有一个最最基本的频率叫核心频率,是实际内存电路的工作时...原创 2019-09-26 08:19:22 · 9611 阅读 · 2 评论