使用uptime命令检查Unix系统的负载状况

Unix系统的uptime命令可以用来检查系统的负载状况。以Linux为例:

$ uptime
 01:32:50 up 40 days,  3:09, 56 users,  load average: 11.72, 11.67, 11.51

load average后面的3个值分别是系统在过去1515分钟负载的平均值(这里的负载包含3种进程:当前正在被CPU执行的,一切条件就绪等待CPU调度的,和等待磁盘读取结果的)。衡量当前系统是否“过载”,需要把load averageCPU的数量结合起来考虑。如果load average的值是1,并且当前系统上只有一个CPU(需要注意,这里的CPU指一个“逻辑CPU”,即需要考虑物理CPU有多个core,每个core支持hyper-thread的情况),那么系统在过去的时间就是“满负荷”运转的。但是如果系统上有4CPU,那么系统就只有1 / 4 = 25%的时间是忙碌的,其余75%是空闲的。

Linux系统的uptime读取/proc/loadavg文件:

$ cat /proc/loadavg
12.97 11.53 11.33 12/3958 7094

前三项对应uptimeload average的输出。第四项中斜线前面的是活跃的kernel进程(线程)数,后面则是系统所有的kernel进程(线程)数。最后一项是系统最新产生的进程ID

对于OpenBSD来说,由于其没有/proc文件系统。它的uptime实现则是通过sysctl系统调用读取vm.loadavg的值。

使用OpenBSD一年的总结

我从去年8月份起开始尝试使用OpenBSD,到现在已经有一年多的时间了,是时候做一个简单的分享了。

首先介绍一下我使用的OpenBSD版本。刚开始的时候,我使用的都是-release的版本。后来为了编译最新的源代码,就切换到了-current版本,也就是当前开发的版本。曾经有人评价说OpenBSD-current版本比有些软件的-release还要稳定,这也从另一个角度说明OpenBSD代码的质量很高。但是如果你真的打算在商用环境下使用-current版本,还是谨慎为妙,因为我就碰到过用了-current版本,系统无法启动的情况;此外也有过代码回滚的先例。所以如果你的系统很重要,在使用-current版本之前还是先找另外一台机器测试一下,这样比较保险。

谈完了我使用的版本,再聊一下我使用OpenBSD的主要用途:

(1)一本好的Unix教材。OpenBSDman手册和代码质量都很高。所以当我想深入了解一个Unix工具时,我会选择阅读OpenBSD上的代码实现和相应的手册。我曾经花费大块的业余时间阅读netcat的代码,当然收获也颇丰:不仅全面复习了网络编程的相关知识,发现bug并提交patch,还写了一本介绍netcat的英文小册子。可以说”一举多得“!

(2)一个好的测试环境。OpenBSD在编译和运行程序时经常会给出一些其它系统无法提供的有用信息,这对及时发现和解决程序问题有着很大的帮助。比如下面程序:

#include <mutex>

int main(void)
{
    std::mutex m;
    m.lock();

    return 0;
}

Arch Linux上编译运行没有任何提示信息:

$ clang++ -g -pthread -std=c++11 test_mutex.cpp
$ ./a.out
$

但在OpenBSD上却给了如下提示:

# clang++ -g -pthread -std=c++11 test_mutex.cpp
# ./a.out
pthread_mutex_destroy on mutex with waiters!

此外,OpenBSD还曾经帮我找到了一个很难查的内存bug,相关内容可以参考这篇文章

(3)OpenBSD系统还提供了一些有用的工具,比如tcpbench。我自己把它移植到Linux平台(代码在这里),方便自己使用。

来而不往非礼也,我不光只对OpenBSD进行“索取”,也给予“了回馈”:

(1)提交patch。这一年来提交了十几个patch,不过都是一些简单的bug修改。

(2)撰写教程。分享了一些使用OpenBSD经验,希望可以帮助到有需要的使用者。

(3)开发工具:

a)Linux系统上有个很好用的lscpu命令,可惜BSD系统没有。我自己实现了一个针对BSD系统的lscpu命令。因为我个人对X86的体系最熟悉,所以这个lscpuX86平台上可以显示详尽的信息,但是对于其他的处理器,比如ARM,只能显示基本的信息。

b)为OpenBSD”量身定制“了一个free命令。

c)libtlscppOpenBSD自带libtlsC++封装:用户不用再操心相关资源释放,甚至不用太了解TLS协议,就可以写出TLS应用程序。

(4)移植程序。如果发现有好的开源工具不支持OpenBSD平台,我也会尝试着去移植过来,比如google/benchmark,我就把它移植到了OpenBSD上。

补充说明:OpenBSD另一个被人称道之处的是安全性,这个网上可以搜索到很多文章。此外,我并没有把OpenBSD当做一个日常办公环境,所以对OpenBSD是否是一个适合大众的操作系统这一话题也没什么发言权。

以上就是我使用OpenBSD一年的总结。

Linux Journal停刊了,BSD magazine还在继续。。。

2017年最后一个月里,发生了两件事:

(1)121日,从1994年创刊的Linux Journal杂志宣布停刊了(参考Linux Journal Ceases Publication),这本历史最悠久的Linux杂志正式退出了历史舞台。我个人觉得很是惋惜,有时搜索一些信息时,经常可以搜到Linux Journal的文章,虽然年代有些久远,但是内容依旧适用。

(2)昨天,也就是1231日,BSD Magazine发布了第100期。这个去年一度要停办的杂志,还是坚持了下来,我也希望它越办越好。我很喜欢每期里关于采访程序员的栏目,这可以让我了解其他国家软件工程师的日常生活和工作经历。此外,每期也会有一些当前的热点内容,比如这一期就介绍了比特币的背景和在FreeBSD上如何安装bitcoind程序。BSD Magazine是免费的,因此如果你对BSD感兴趣,可以考虑订阅一下。一分钱不花,学到新知识,何乐而不为?

一个人的BSD——MidnightBSD

MidnightBSD(官方主页在这里:http://www.midnightbsd.org) 是一个“小众版”的BSD系统,作者是Lucas Holt。尽管MidnightBSD目前只有Lucas一个人维护,但是它却诞生在2005年,也算是“历史悠久”了。而MidnightLucas养的第一只猫的名字。

MidnightBSD的初衷是要做一个对普通用户更友好的“桌面版”FreeBSD。我并没有使用过MidnightBSD,所以无法对其用户体验做出评价。但是Lucas一个人来做维护一个操作系统的发行版的所有工作:改代码,搭建cvs服务器,创建mport等等,还是很令我佩服的。不过也正如Lucas自己所说的:

Learning how to work on MidnightBSD has been the most rewarding project I’ve ever done.

尽管工作艰难,但是整个过程也让Lucas收获颇丰,学到了很多知识,这也的确是“回报丰富”。

坦率地讲,我个人很羡慕Lucas,也希望有朝一日能拥有自己的操作系统发行版。

Arch Linux —— 一个不错的Linux发行版

使用Arch Linux差不多有一年的时间了,总体感觉它是一个很不错的Linux发行版。

Arch Linux采用的是“滚动发布”(rolling release)模式,只需一个“pacman -Syu”命令,就可以用上最新的内核和软件包。这对那些对软件版本“追求极致”的开发者们(比如我),无疑是个“福音”。此外,Arch Linux的安装包做的很“人性化”。例如,我最近尝试使用clang开发OpenMP程序,不同于gccclang需要安装额外的包。而在安装clang时,系统会给出详细的提示信息:

# pacman -S clang
......
Optional dependencies for clang
    openmp: OpenMP support in clang with -fopenmp
    python2: for scan-view and git-clang-format
......

可以看到,除了表明需要openmp安装包外,系统还指出使用clang时要使用-fopenmp选项,这充分反映了安装包“考虑”的很“周全”。而在使用其它的一些Linux发行版时,安装clangOpenMP开发包时就很费一番周折。

另外,Arch Linux已经正式宣布不再支持i686平台了,这也提醒我们,也许是时候考虑和32位处理器说再见了。

如何计算进程占用的物理内存

How to get the process resident set size一文不仅介绍了在WindowsUnix(包括LinuxBSDmacOS等等)操作系统上如何获取进程所使用的峰值和实时物理内存,并提供了现成的代码。在这里我只分析一下Linux上相关功能的实现:

(1)获取峰值内存:

size_t getPeakRSS() {
    struct rusage rusage;
    getrusage(RUSAGE_SELF, &rusage);
    return (size_t)(rusage.ru_maxrss * 1024L);
}

getrusage函数获取进程资源的使用情况。当第一个参数时RUSAGE_SELF时,表示得到当前进程的统计数据。struct rusage中的ru_maxrss即表示该进程物理内存的使用峰值,因为度量单位是kilobytes,故而需要乘以1024

(2)获得实时内存:

size_t getCurrentRSS() {
    long rss = 0L;
    FILE* fp = NULL;
    if ( (fp = fopen( "/proc/self/statm", "r" )) == NULL )
        return (size_t)0L;      /* Can't open? */
    if ( fscanf( fp, "%*s%ld", &rss ) != 1 )
    {
        fclose( fp );
        return (size_t)0L;      /* Can't read? */
    }
    fclose( fp );
    return (size_t)rss * (size_t)sysconf( _SC_PAGESIZE);
}

/proc/self/statm文件共包含7个字段,第二个即是进程当前时刻占用的物理内存,单位是页面大小。要获得精确的字节数,还需通过sysconf系统调用获得页面所占据的空间,通常为4096

 

Linux垄断超级计算机

top500网站公布的统计数据显示,目前世界排名前500的超级计算机使用的全部都是Linux操作系统:1
这就意味着之前“500强”中仅存的2Unix也终于“沦陷”了:

2

看一下关于Linux发行版的统计数据:

3

占据份额最大的是“Linux”,是因为不能确定具体的发行版?还是自己组装的,所以不属于任何发行版?我没有找到解释。但是“屈居亚军”的是CentOS,这倒也反映了这个RHEL的“免费社区版本”的稳定性以及受欢迎程度。如果你想选一个不花钱,又可靠的操作系统,CentOS可能是一个不错的选择。

此外,中国的超级计算机数量首次超越美国,成为世界第一:

4

最后,我的前东家HPE在生产厂商的排名中继续高居榜首,联想和浪潮,这两个来自中国的企业紧随其后:

5

为什么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