*NIX & Hacking —— 第3期

做一本我感兴趣的杂志,就这么简单!

D

Lessons Learned: Writing a filesystem in D

Golang

An Exercise in Profiling a Go Program
Let’s learn Go!

Javascript

jsbeeb

Kernel

Build a Red Hat 7 custom kernel
How to Compile Linux Kernel from Source to Build Custom Kernel

Scala

Difference between object and class in Scala

Security

Introducing s2n, a New Open Source TLS Implementation

Unix

Solaris new system calls: getentropy(2) and getrandom(2)
websocketd
When ‘int’ is the new ‘short’

Virtualization

Understanding VT-d: Intel Virtualization Technology for Directed I/O

Easter egg

FUDCON PUNE 2015
Multiple choice
What is the difference between x64 and IA-64?

DMA(Direct Memory Access)简介

DMA(Direct Memory Access)是指在现代计算机系统上,外接设备可以不用CPU干预,直接把数据传输到内存的技术。

DMA控制器(controller)是一种特殊的硬件,它用来管理数据传输和总线仲裁。当要发起数据传输时,它会发一个申请使用系统总线的DMA请求信号给CPUCPU完成当前操作后,就会让出系统总线,同时会发一个DMA确认信号给DMA控制器。接下来,DMA控制器接管系统总线,开始数据传输。数据传输完毕后,DMA控制器会通知CPU重新接管总线。

正常情况下,CPU全权负责内存的读写操作,而DMA技术可以把CPU解放出来,这将使计算机性能得到显著改善。

参考资料:
DMA (Direct Memory Access)

硬件虚拟化(hardware virtualization)浅析

硬件虚拟化(hardware virtualization)可以创建出多个系统虚拟机实例(system virtual machine instance),这些虚拟机可以运行整个操作系统(包括它们的内核)。硬件虚拟化分为以下几种:

a)Full virtualization - binary translation:提供一个由虚拟化硬件部件组成完整的虚拟化系统,可以在上面安装一个不需修改的,完整的操作系统。这项技术结合了直接的处理器执行和必要时指令的二进制转化(binary translation)。

b)Full virtualization - hardware-assisted:提供一个由虚拟化硬件部件组成完整的虚拟化系统,可以在上面安装一个不需修改的,完整的操作系统。这项技术利用了处理器的支持,使得执行虚拟机更加有效率(比如AMD-VIntel-VT扩展)。

c)Paravirtualization:提供一个支持接口(interface)的虚拟系统,虚拟机操作系统(guest OS)利用这个接口就可以有效地利用宿主机(host)资源(通过hypercalls),而不需要所有组件的完全虚拟化。

还有一种hybrid virtualization,利用hardware-assisted virtualization加上一些高效的paravirtualization调用,可以提供更好的性能(performance)。

Hypervisor(或被称为Virtual Machine Monitor (VMM))是用来创建虚拟机的,它可以由软件(software),硬件(hardware)或固件(firmware)实现。有2种类型的hypervisor,请参考下图:

hypervisor

类型1)这种hypervisor直接运行在处理器上 (例如:hyper-VKVM ,也被称之为native hypervisorbare-metal hypervisorHypervisor的管理工作是通过一个享有特权模式的guest OS来进行(在上图中,为Guest OS #0),这个guest OS可以创建和启动其它的guest OS

类型2)这种hypervisor运行在宿主机操作系统上 (例如:VirtualBox 。由宿主机操作系统负责管理hypervisor和启动新的guest OS

参考资料:
Systems Performance: Enterprise and the Cloud

*NIX & Hacking —— 第2期

做一本我感兴趣的杂志,就这么简单!

Debug

Introduction to Debuggers

Docker

DOCKER MACHINE 0.3.0 DEEP DIVE

Git

First aid git

Golang

go-lang-cheat-sheet

Kernel

Kernel and userspace tracing: with LTTng and his friends

Regular Expression

Five Invaluable Techniques to Improve Regex Performance

Rust

First Rust Program Pain (So you can avoid it…)

Scala

Various ways to run Scala code
Why does the same scala code work OK in command line while not in Intellij?

Unix

A little collection of cool unix terminal/console/curses tools
How big is the pipe buffer?
Stack Smashing On A Modern Linux System
Unix history repository

Easter egg

DMA (Direct Memory Access)
Get Unix Jobs
Here are 13 tech jobs that pay at least $130,000 across the country

闲侃CPU(四)

CPU利用率(utilization)是指CPU在一段时间内用于做“有用功”的时间和整个这段时间的百分比值。所谓的“有用功”即CPU没有运行内核(kernelIDLE线程,而是运行用户级(user-level)应用程序线程,或是其它的内核(kernel)线程,或是处理中断。

CPU用来执行用户级(user-level)应用程序的时间称之为user-time,而运行内核级(kernel-level)程序的时间称之为kernel-time

计算密集型(computation-intensive)程序也许会把几乎所有的时间用来执行用户级(user-level)程序代码。而I/O密集型(I/O-intensive)程序有相当多的时间用来执行系统调用(system call),这些系统调用将会执行内核代码产生I/O

当一个CPU利用率达到100%时,称之为饱和(saturated)。在这种情况下,线程在等待获得CPU时,将会面临调度延迟(scheduler latency)的问题。

闲侃CPU(三)

CPU执行一条指令包含下面5个步骤,其中每个步骤都会由CPU的一个专门的功能单元(function unit)来完成:
(1)取指令;
(2)解码;
(3)执行指令;
(4)内存访问;
(5)写回寄存器。
最后两个步骤是可选的,因为很多指令只会访问寄存器,不会访问内存。上面的每个步骤至少要花费一个时钟周期(clock cycle)去完成。内存访问通常是最慢的,要占用多个时钟周期。 

指令流水线(Instruction Pipeline):是一种可以并行执行多条指令的CPU结构(architecture),也即同时执行不同指令的不同部分。假设上面提到的执行指令5个步骤每个步骤都占1个时钟周期,那么完成一个指令需要5个时钟周期(假设步骤45都要经历)。在执行这条指令的过程,每个步骤只有CPU的一个功能单元是工作的,其它的都在空闲中。采用指令流水线以后,多个功能单元可以同时活跃,举个例子:在解码一条指令时,可以同时取下一条指令。这样可以大大提高效率。理想情况下,执行每条指令仅需要1个时钟周期。

更进一步,如果CPU内执行特定功能的功能单元有多个的话,那么每个时钟周期可以完成更多的指令。这种CPU结构称之为“超标量(superscalar)”。指令宽度(Instruction Width)描述了可以并行处理的指令的数量。现代CPU一般是3-wide4-wide,即每个时钟周期可处理3~4条指令。

Cycles per instruction(CPI)是描述CPU在哪里耗费时钟周期和理解CPU利用率的一个重要度量参数。这个参数也可以表示为instructions per cycle(IPC)CPI表达了指令处理的效率,并不是指令本身的效率。

闲侃CPU(二)

时钟(clock)是驱动所有CPU处理器逻辑的数字信号。

CPU的速率可以用时钟周期(clock cycle)来衡量。举个例子,5 GHz CPU每秒可以产生50亿的时钟周期。每条CPU指令的执行都会占用一个或多个时钟周期。

CPU的速率是衡量CPU性能的一个重要参数。但是更快的CPU速率并不一定能带来性能的改善,而是要看这些CPU时钟周期都用在做什么。举个例子,如果都用在等待访问内存的结果,那么提高CPU的速率就不会带来真正性能的提升。

“Retired Instruction”的含义

最近在读intel CPU相关文档时,看到一个词:“Retired Instruction”,不知道该作何解释。上网google到这篇网页,理解含义应该是:因为执行每个指令要花多个时钟周期,并且CPU存在流水线,乱序执行等问题,“Retired Instruction”就是指在一个时间点上,已经确定执行完成的指令。

闲侃CPU(一)

这个文章系列来自于Brendan Gregg所著《Systems Performance: Enterprise and the Cloud》一书第六章《CPU》的读书笔记。

系统板卡上的CPU插槽称之为socket,一颗物理CPU芯片可以称之为processor。现在CPU早已经进入多核时代,一颗CPU processor可以包含多个core,而一个core又可以包含多个hardware thread。每个hardware thread在操作系统看来,就是一个logic CPU,即一个可以被调度的CPU实例(instance)。举个例子,如果一颗CPU processor包含4core,而每个core又包含2hardware thread,则从操作系统角度看来,一共有8个可以使用的“CPU”(1*4*2 = 8)。

lscpu输出为例:

[[email protected] ~]# lscpu
......
Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                120
On-line CPU(s) list:   0-119
Thread(s) per core:    2
Core(s) per socket:    15
Socket(s):             4
......

120 = 2 * 15 * 4, 即CPU(s) = Thread(s) per core * Core(s) per socket * Socket(s)

 

为了改善内存访问性能,CPU processor提供了寄存器3cache。整个存储模型如下所示(从上往下,容量越小,CPU访问越快):
* register(寄存器)
L1 cache
L2 cache
L3 cache
Main memory(主存储器)
Storage Device(外接存储器)