Hyper Thread超线程的种种

说起HT技术,这早就是15年以前的技术了,当下主流的X86 CPU就没见过不支持HT技术的。简而言之,HT技术就是一个把物理CPU core虚拟成多个逻辑CPU并允许并行执行指令的功能。之所以写这篇文章主要是回答几个常见的问题:

  • 为什么有HT技术,为什么HT只有单核心双线程?
  • HT和真实的core到底有什么区别?
继续阅读“Hyper Thread超线程的种种”

Linux CFS调度器

一直没有写过关于Linux内核调度器的内容,这几天被问起,简单的讲了讲,收到一堆challenge,这次决定做一个通篇总结方便自己整理思路。
要说Linux2.4和2.6最大的差异就在于CFS调度器的引入。CFS是 Completely Fair Scheduler 的缩写。不过讲真话,个人并不完全认同“完全公平”调度是这个算法的本意,如何裁决资源抢占(preempt,字面上是优先权)才是这个调度器的本意。

继续阅读“Linux CFS调度器”

LLC缓存一致性保障原理

如果大家了解一点CPU的知识,应该能够了解到当前的x86架构的CPU都通过多级缓存实现内存的快速访问。目前较为流行的做法是3级缓存的设置,L1/L2为每个CPU core独享,而L3 或者LLC(last level cache)则由同一个socket上的所有物理core共享。这个时候如果考虑双路甚至多路CPU的话,由于内存中的数据有且只有一份,但多个CPU很可能在此基础上创建属于自己socket的缓存。对于内存的读访问来说,多份数据并不会影响到一致性,但一旦有一个socket上的某个core修改了数据,一致性问题则会凸显。究竟CPU是如何实现一致性保障的呢?

继续阅读“LLC缓存一致性保障原理”

应用程序状态切换检测

任何一个合理的应用程序的运行时间内,微观上都会存在或多或少的“状态切换”。所谓状态切换的定义就是在用户可感知的特征变化。可感知的特征可以理解为对各种资源的需求变化的特性。
有点绕,举个简单例子:一个SQL数据库,在只有一个用户连接的时候,每次用户的访问都会出发一个状态切换事件,而当用户使用长连接(pipe line)去执行多个SQL命令时,由于SQL的不同,每个SQL之间就是一个状态切换。

继续阅读“应用程序状态切换检测”

Linux的tickless设置

尽管当前已经是多核心SMP时代,但作为”多用户,多任务“操作系统,Linux还是通过分时复用的方式,即给一个个任务分配不同的时间片从而实现用户感知上的多任务。而各种中断则拥有最高的响应权限,可以直接导致线程的切换。

问题来了。记得我之前曾经在某篇帖子上说过:低时延和大吞吐量有的时候是一对矛盾。解决低时延,系统需要多个不断切换的线程接收用户端的数据——想象一下加特林机枪的射速是通过多枪管轮流发射达到低时延的目的;而大吞吐量往往需要一个不受干扰的持续运行状态——就如一条生产线,每一次更换产品都会带来一系列的时间损失。

继续阅读“Linux的tickless设置”

如何让SElinux和Docker并存

作为Redhat/Centos/Fedora 系的Linux特性之一,SElinux是一个相对简单易用安全管理工具。具体的细节我们这边就先不展开,简单的举个例子就是,假设现在某个网站的漏洞允许用户上传一个页面文件(比如php文件)到任意目录,如果有了SELinux的保护,不同的MAC权限保证了上传的文件依然无法被执行。

继续阅读“如何让SElinux和Docker并存”

从stream的多线程协同效率说起

似乎每次开头都要讲述一下计算机或者说x86架构的演进历史,这似乎成了站长Litrin的一种习惯。现在的x86架构CPU频率以及最大IPC已经接近极限,厂商倾向于将越来越多的核心通过SMP技术多线程负载。不妨做一个思想实验:将计算机的任务想象为搬砖,CPU核心则是搬砖的工人。根据我们的常识,工人越多则任务完成的越快,也就是意味着核心数和性能是成正比的。然而事实真的如此吗?

继续阅读“从stream的多线程协同效率说起”