为什么root用户所在的群组叫wheel?

Unix系统下,root用户所在的组称之为wheel

# ls -alt
total 18776
drwx------   6 root  wheel      512 Oct  7 01:30 .
-rw-------   1 root  wheel       40 Oct  6 17:20 .git-credentials
drwxr-xr-x   7 root  wheel      512 Oct  5 17:32 Project
-rw-r--r--   1 root  wheel       56 Oct  5 17:28 .gdbinit
......

Wheel来源于big wheel这个俚语,指有强大“威力”或“影响力”的人。随之而来的就是TENEX操作系统发明了wheel bit,一个允许处理器做一些限制性的操作的“特权bit”。Unix操作系统则在上世纪八十年代引入wheel,这就是为什么root用户所在的组称之为wheel的来历。

参考资料:
Wheel (Unix term)

OpenBSD Hackathon,一种理想的hackathon

199964日,第一次OpenBSD Hackathon活动举行,这也是hackathon一词正式面世。与其它hackathon不同,只有被OpenBSD Hackathon邀请的开发者才能参与。由于OpenBSD项目的经费一直是捉襟见肘(比如2014年因为交不起电费而导致OpenBSD项目差点关闭这个事件,具体请参考这里),很多开发者都是自掏腰包买单差旅费。此外,聚会地点通常也选择在大学校园或是其他非常便宜的地点,而OpenBSD社区也号召有个人或组织可以提供免费的场所供OpenBSD Hackathon使用。

尽管有种种困难,但是OpenBSD Hackathon活动的质量还是相当高的。我最近读到两篇描述OpenBSD Hackathon的博文:Historical: My first OpenBSD HackathonMichael W. Lucas: Visiting the OpenBSD t2k13 Hackathon,感觉这是一种最理想的hackathon:没有喧哗,没有吵闹,开发者围坐在一个小房间内全情投入;在一周的时间内互相合作,最后实现出有实用意义的软件功能。这真是一件很cool的事,不是吗?

OpenBSD Hackathon另一个很“文艺”的地方就是几乎每次活动都会设计一款精美T恤发给参加者作为纪念。我个人比较喜欢下面这个图案:

DGnPMbSXoAAJS5U

如果你想了解更多关于OpenBSD Hackathon的情况,请访问https://www.openbsd.org/hackathons.html

 

关于SPARC处理器的10个小知识

距离1987Sun公司发布第一个基于SPARC处理器的工作站整整过去了30年,本文总结了关于SPARC处理器的10个小知识:
(1)SPARC代表Scalable Processor Architecture
(2)SPARC采用的是RISCReduced Instruction Set Computing)指令集;
(3)SPARC处理器项目开始于1984年,字长为32-bit,结构版本号为V7,首席架构师是Robert Garner
(4)第一款基于SPARC处理器的工作站Sun 4/260发布于1987年;
(5)1989年,Sun公司把SPARC规范的所有权转交给SPARC International, Inc. (“SI”),一个独立的,非盈利的负责管理和授权SPARC技术的机构;
(6)1992年发布的SuperSPARCSPARC V8)是第一个超标量(super scalar)处理器;
(7)1993年发布的SPARC V9,标志着处理器字长变为64-bit
(8)2015Oracle发布了第一个基于新的Oracle SPARC Architecture 2015规范的处理器:SPARC M7
(9)截止20174月,最新的SPARC商用高端处理器是Fujitsu公司的SPARC64 XII
(10)想了解更多SPARC处理器的知识,请访问:https://sparc.org

参考资料:
Chip Hall of Fame: Sun Microsystems SPARC Processor
1987 – 2017: SPARC Systems & Computing Epochs
Wikipedia SPARC
sparc.org

FreeBSD操作系统上获取CPU信息

FreeBSD既没有GNU/Linux操作系统上的/proc/cpuinfo文件,也不提供lscpu命令(其实lscpu也是访问的/proc/cpuinfo文件)。因此在FreeBSD上想了解当前机器的CPU信息,需要费点小周折:

(1)使用sysctl命令:

# sysctl hw.model hw.machine hw.ncpu
hw.model: Intel(R) Core(TM)2 CPU          6600  @ 2.40GHz
hw.machine: amd64
hw.ncpu: 2

(2)读取/var/run/dmesg.boot文件:

# grep -i cpu /var/run/dmesg.boot
CPU: Intel(R) Core(TM)2 CPU          6600  @ 2.40GHz (2400.05-MHz K8-class CPU)
FreeBSD/SMP: Multiprocessor System Detected: 2 CPUs
cpu0: <ACPI CPU> on acpi0
cpu1: <ACPI CPU> on acpi0
est0: <Enhanced SpeedStep Frequency Control> on cpu0
est1: <Enhanced SpeedStep Frequency Control> on cpu1
SMP: AP CPU #1 Launched!

(3)通过dmidecode命令获得CPUcache信息:

# dmidecode -t processor -t cache
# dmidecode 3.0
Scanning /dev/mem for entry point.
SMBIOS 2.4 present.

Handle 0x0004, DMI type 4, 35 bytes
Processor Information
        Socket Designation: LGA 775
        Type: Central Processor
        Family: Pentium 4
        Manufacturer: Intel
        ID: F6 06 00 00 FF FB EB BF
        Signature: Type 0, Family 6, Model 15, Stepping 6
        Flags:
                FPU (Floating-point unit on-chip)
                VME (Virtual mode extension)
                DE (Debugging extension)
                PSE (Page size extension)
......
Handle 0x0005, DMI type 7, 19 bytes
Cache Information
        Socket Designation: L1-Cache
        Configuration: Enabled, Not Socketed, Level 1
        Operational Mode: Write Back
        Location: Internal
        Installed Size: 32 kB
        Maximum Size: 32 kB
......

参考资料:
FreeBSD CPU Information Command
What is the equivalent of /proc/cpuinfo on FreeBSD v8.1?

Perf笔记(七)——perf trace

perf trace有类似于strace功能,可以实时监控程序的系统调用:

# perf trace ./a.out
 0.032 ( 0.002 ms): a.out/7673 brk(                                                                  ) = 0x1e6b000
 0.051 ( 0.005 ms): a.out/7673 access(filename: 0xb7c1cb00, mode: R                                  ) = -1 ENOENT No such file or directory
 0.063 ( 0.005 ms): a.out/7673 open(filename: 0xb7c1a7b7, flags: CLOEXEC                             ) = 3
 0.070 ( 0.002 ms): a.out/7673 fstat(fd: 3, statbuf: 0x7ffffb72bc80                                  ) = 0
 0.073 ( 0.004 ms): a.out/7673 mmap(len: 38436, prot: READ, flags: PRIVATE, fd: 3                    ) = 0x7f18b7e15000
 0.079 ( 0.001 ms): a.out/7673 close(fd: 3                                                           ) = 0
 0.087 ( 0.005 ms): a.out/7673 open(filename: 0xb7e21ec0, flags: CLOEXEC                             ) = 3
 0.093 ( 0.003 ms): a.out/7673 read(fd: 3, buf: 0x7ffffb72be28, count: 832                           ) = 832
 0.099 ( 0.002 ms): a.out/7673 fstat(fd: 3, statbuf: 0x7ffffb72bcc0                                  ) = 0
 0.102 ( 0.003 ms): a.out/7673 mmap(len: 8192, prot: READ|WRITE, flags: PRIVATE|ANONYMOUS, fd: -1    ) = 0x7f18b7e13000
 0.110 ( 0.004 ms): a.out/7673 mmap(len: 2283024, prot: EXEC|READ, flags: PRIVATE|DENYWRITE, fd: 3   ) = 0x7f18b79cf000
 0.116 ( 0.007 ms): a.out/7673 mprotect(start: 0x7f18b79fc000, len: 2093056                          ) = 0
 0.125 ( 0.005 ms): a.out/7673 mmap(addr: 0x7f18b7bfb000, len: 8192, prot: READ|WRITE, flags: PRIVATE|DENYWRITE|FIXED, fd: 3, off: 180224) = 0x7f18b7bfb000
 0.142 ( 0.002 ms): a.out/7673 close(fd: 3                                                           ) = 0
 0.153 ( 0.006 ms): a.out/7673 open(filename: 0xb7e134c0, flags: CLOEXEC                             ) = 3
 0.161 ( 0.003 ms): a.out/7673 read(fd: 3, buf: 0x7ffffb72bdf8, count: 832                           ) = 832
 0.165 ( 0.002 ms): a.out/7673 fstat(fd: 3, statbuf: 0x7ffffb72bc90                                  ) = 0
 0.169 ( 0.005 ms): a.out/7673 mmap(len: 2216432, prot: EXEC|READ, flags: PRIVATE|DENYWRITE, fd: 3   ) = 0x7f18b77b1000
......

Perf笔记(四)——profile应用程序

使用perf record命令可以profile应用程序  (编译程序要使用-g,推荐使用-g -O2

perf record program [args]

或者在程序启动以后,使用-p pid选项:

perf record -p pid

默认情况下,信息会存在perf.data文件里,使用perf report命令可以解析这个文件:

Capture

哪些函数占用CPU比较多,一目了然。

另外,在使用perf record时可以加--call-graph dwarf选项:

--call-graph
 Setup and enable call-graph (stack chain/backtrace) recording, implies -g.
 Default is "fp".

采样结果如下:

Capture

关于ChildrenSelf的含义,perf wiki给了一个详尽的解释。以下列代码为例:

void foo(void) {
    /* do something */
}

void bar(void) {
    /* do something */
    foo();
}

int main(void) {
    bar()
    return 0;
}

Self表示函数本身的overhead:如果foo函数的overhead60%,那么barSelf overhead就是40%(刨除foo所占部分)。因为foobar都是main的子函数,所以二者的overhead都要计算入mainChildren overhead

对于采用--call-graph dwarf选项生成的perf.data做出的火焰图如下:

Capture可以看到显示了完整的函数调用栈。

Perf笔记(三)——tiptop

Tiptop是一个Linux系统性能工具,它通过读取CPU硬件计数器的信息(比如cahche missexecuted instructions per cycle等等),使我们对程序的执行效率有了更清晰的认识:

Capture

Tiptop通过perf_event_open(http://man7.org/linux/man-pages/man2/perfeventopen.2.html)系统调用(2.6.31版本称为perf_counter_open)来完成读取硬件计数器信息:

int perf_event_open(struct perf_event_attr *attr,
                           pid_t pid, int cpu, int group_fd,
                           unsigned long flags);

attr用来指定需要关注哪些硬件计数器;pidcpu指定关注运行在哪些CPU的进程(线程);group_fd用来设定event group,创建group leader时,group_fd设为-1flags可以置为0

perf_event_open执行成功后会返回一个有效的文件描述符,后续可通过ioctlread系统调用对这个文件描述符进行操作,达到想要的目的。