Blog

时钟周期时间

时钟周期时间 #

我们先来理解一下什么是时钟周期时间。你在买电脑的时候,一定关注过 CPU 的主频。比如我手头的这台电脑就是 Intel Core-i7-7700HQ 2.8GHz,这里的 2.8GHz 就是电脑的主频(Frequency/Clock Rate)。这个 2.8GHz,我们可以先粗浅地认为,CPU 在 1 秒时间内,可以执行的简单指令的数量是 2.8G 条。

如果想要更准确一点描述,这个 2.8GHz 就代表,我们 CPU 的一个“钟表”能够识别出来的最小的时间间隔。就像我们挂在墙上的挂钟,都是“滴答滴答”一秒一秒地走,所以通过墙上的挂钟能够识别出来的最小时间单位就是秒。

而在 CPU 内部,和我们平时戴的电子石英表类似,有一个叫晶体振荡器(Oscillator Crystal)的东西,简称为晶振。我们把晶振当成 CPU 内部的电子表来使用。晶振带来的每一次“滴答”,就是时钟周期时间。

在我这个 2.8GHz 的 CPU 上,这个时钟周期时间,就是 1/2.8G。我们的 CPU,是按照这个“时钟”提示的时间来进行自己的操作。主频越高,意味着这个表走得越快,我们的 CPU 也就“被逼”着走得越快。

如果你自己组装过台式机的话,可能听说过“超频”这个概念,这说的其实就相当于把买回来的 CPU 内部的钟给调快了,于是 CPU 的计算跟着这个时钟的节奏,也就自然变快了。当然这个快不是没有代价的,CPU 跑得越快,散热的压力也就越大。就和人一样,超过生理极限,CPU 就会崩溃了。

Viewpoint #

From #

03 | 通过你的CPU主频,我们来谈谈“性能”究竟是什么?

real time, user time, sys time

real time, user time, sys time #

我们简单运行一下 time 命令。它会返回三个值,第一个是 real time,也就是我们说的 Wall Clock Time,也就是运行程序整个过程中流逝掉的时间;第二个是 user time,也就是 CPU 在运行你的程序,在用户态运行指令的时间;第三个是 sys time,是 CPU 在运行你的程序,在操作系统内核里运行指令的时间。而程序实际花费的 CPU 执行时间(CPU Time),就是 user time 加上 sys time。

$ time seq 1000000 | wc -l
1000000
real  0m0.101s
user  0m0.031s
sys   0m0.016s

在我给的这个例子里,你可以看到,实际上程序用了 0.101s,但是 CPU time 只有 0.031+0.016 = 0.047s。运行程序的时间里,只有不到一半是实际花在这个程序上的。

备注:你最好在云平台上,找一台 1 CPU 的机器来跑这个命令,在多 CPU 的机器上,seq 和 wc 两个命令可能分配到不同的 CPU 上,我们拿到的 user time 和 sys time 是两个 CPU 上花费的时间之和,可能会导致 real time 可能会小于 user time+sys time。

...

toc:Performance

Content #

Amdahl定律 什么是性能 为什么循环嵌套的改变会影响性能 伪共享

CPU性能 #

real time, user time, sys time CPU各个时间片断的含义 Load Average与TASK_UNINTERRUPTIBLE 平均负载 三个不同时间间隔的平均负载 平均负载与 CPU 使用率 时钟周期时间 CPU执行时间的公式 系统调用过程中的CPU上下文切换 进程上下文切换 发生进程调度的场景 进程与线程的区别 线程上下文切换的两种情形 中断上下文切换 进程运行状态 观察软中断的变化 perf分析CPU性能的两种方法 根据工具查CPU性能指标 根据CPU性能指标来找工具

内存 #

sar查看内存指标 观察/proc/zoneinfo 根据工具查内存性能指标 根据内存性能指标找工具

Tools #

vmstat使用示例 pidstat查看进程切换情况 pidstat查看进程IO情况 cook:bcc cook:strace

实验 #

使用sysbench来模拟系统多线程调度切换 短时应用导致的CPU使用率升高

sub:Storage Performance

什么是性能

什么是性能 #

我们一般把性能,定义成响应时间的倒数,也就是:性能 = 1/ 响应时间这样一来,响应时间越短,性能的数值就越大。同样一个程序,在 Intel 最新的 CPU Coffee Lake 上,只需要 30s 就能运行完成,而在 5 年前 CPU Sandy Bridge 上,需要 1min 才能完成。那么我们自然可以算出来,Coffee Lake 的性能是 1/30,Sandy Bridge 的性能是 1/60,两个的性能比为 2。于是,我们就可以说,Coffee Lake 的性能是 Sandy Bridge 的 2 倍。

Viewpoint #

From #

03 | 通过你的CPU主频,我们来谈谈“性能”究竟是什么?

强有力的讲话者与无力的讲话者

强有力的讲话者与无力的讲话者,分别适合领导什么样的团队? #

如果团队成员是被动的追随者,那么强有力的讲话者不会遇到问题。但是,如果团队成员是高度积极主动的,能主动提出更快速的折叠T恤的方法,那么无力的讲话者就有效率得多。积极主动的团队在无力的讲话者领导下,与由强力的领导者领导相比,产出会提高22%。团队成员认为强有力的讲话者会因为别人的新想法而感到威胁,而无力的讲话者更愿意接受建议。试探性地讲话不会建立起支配性,但是可以赢得较高的声望。如果试探性的讲话者对于建议持开放态度,那么团队成员会更有效率地工作。

Viewpoint #

From #

两种匮乏

Content #

以匮乏为主线,河森堡在极为宏大的视野下,回顾了300万年的早期人类历史和 8000年以来的农耕文明史,我们会发现有两种匮乏令人瞩目,分别是哪两种?应如何应对这两种匮乏?

食物的匮乏和医疗的匮乏。解决食物的匮乏,需要协调人和作物、牲畜之间的关系;解决医疗的匮乏,则需要协调人和细菌、病毒之间的关系。

Viewpoint #

From #

getBoundingClientRect与offsetWidth及offsetHeight

Content #

举例说明Element.getBoundingClientRect()的结果与HTMLElement的 offsetWidth和offsetHeight属性不一致的情形。

某div元素有如下规则: width: 100px; transform: scale(0.5); getBoundingClientRect()结果中的width会是50,而offsetWidth会是100。

Viewpoint #

From #

toc:Linux

Content #

消除静态噪音 sub:lvm

权限管理 #

setuid位 setgid位 sticky-bit位 设置特殊权限 找出所有设置了setuid位权限的文件 sub:ACL

系统编程 #

SysV调用约定 用嵌入汇编的形式使用open系统调用 信号处理函数的调用过程

虚拟化 #

Linux Namespace隔离不彻底 容器的Namespace技术 cgroup控制容器资源 sub:iptables sub:Nginx

系统管理 #

开机强制检测硬盘(fsck)

Tools #

ImageMagick wma转换成mp3 屏幕注释软件: gromit-mpx

Ubuntu #

apt sub:xfce4

Cookbook #

cook:dpkg cook:LinuxCommand cook:Vim

Load Average与TASK_UNINTERRUPTIBLE

Content #

Linux中,用 Cgroups 做了配置,即使保证了容器的 CPU 资源,然而 Load Average 值升高,应用的性能下降,这背后的原因是什么呢?

Linux下Load Average计算公式: Load Average= 可运行队列进程平均数 + 休眠队列中不可打断的进程平均数

Linux 下的 Load Averge 不仅仅计算了 CPU Usage 的部分,它还计算了系统中 TASK_UNINTERRUPTIBLE 状态的进程数目。在 Linux 内核中有数百处调用点,它们会把进程设置为 D 状态,主要集中在 disk I/O 的访问和信号量(Semaphore)锁的访问上,因此 D 状态的进程在 Linux 里是很常见的。无论是对 disk I/O 的访问还是对信号量的访问,都是对 Linux 系统里的资源的一种竞争。当进程处于 D 状态时,就说明进程还没获得资源,这会在应用程序的最终性能上体现出来,也就是说用户会发觉应用的性能下降了。

Viewpoint #

From #

平均负载