uptime和vmstat在显示系统负载的区别

uptime可以用来检查Linux系统的负载状况:

$ uptime
 22:53:34 up 169 days,  6:47, 19 users,  load average: 1.99, 2.00, 2.03

load average后面的3个值分别是系统在过去1515分钟负载的平均值(这里的负载包含3种进程:当前正在被CPU执行的,一切条件就绪等待CPU调度的,和等待I/O操作结果的)。

vmstat也可以用来检查Linux系统的负载状况:

$ vmstat 1
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 2  0      0 32312576 1716732 74998032    0    0     0     8    0    0  2  0 98  0  0
 2  0      0 32312264 1716732 74998032    0    0     0     0 3059  139  5  0 95  0  0
 ......

其中r这一栏表示当前正在被CPU执行的,和一切条件就绪等待CPU调度的进程。由于其不包含等待I/O操作结果的进程,所以vmstatuptime更准确地表示系统是否“饱和”:如果r的值大于CPU数量(这里的CPU指一个“逻辑CPU”,即需要考虑物理CPU有多个core,每个core支持hyper-thread的情况),那么系统就处于饱和状态。

对于其它的Unix系统,需要查阅文档确认是否同Linux一致。

查看Unix/Linux进程内存分布

Unix平台,如果要查看某个进程的内存分布,可以使用gdb附着在该进程,再使用“info proc mappings”命令:

$ sudo gdb -p 1
......
(gdb) info proc mappings
process 1
Mapped address spaces:

          Start Addr           End Addr       Size     Offset objfile
            0x400000           0x401000     0x1000        0x0 /usr/bin/runit
            0x401000           0x480000    0x7f000     0x1000 /usr/bin/runit
            0x480000           0x4aa000    0x2a000    0x80000 /usr/bin/runit
            0x4ab000           0x4ae000     0x3000    0xaa000 /usr/bin/runit
            0x4ae000           0x4b0000     0x2000        0x0
            0x62d000           0x650000    0x23000        0x0 [heap]
      0x7ffe5e3f3000     0x7ffe5e414000    0x21000        0x0 [stack]
      0x7ffe5e4a4000     0x7ffe5e4a7000     0x3000        0x0 [vvar]
      0x7ffe5e4a7000     0x7ffe5e4a8000     0x1000        0x0 [vdso]

另外在Linux系统上,也可以使用pmap命令:

$ sudo pmap -x 1
1:   runit
Address           Kbytes     RSS   Dirty Mode  Mapping
0000000000400000       4       4       0 r---- runit
0000000000401000     508     440       0 r-x-- runit
0000000000480000     168     124       0 r---- runit
00000000004ab000      12      12      12 rw--- runit
00000000004ae000       8       8       8 rw---   [ anon ]
000000000062d000     140       8       8 rw---   [ anon ]
00007ffe5e3f3000     132      12      12 rw---   [ stack ]
00007ffe5e4a4000      12       0       0 r----   [ anon ]
00007ffe5e4a7000       4       4       0 r-x--   [ anon ]
---------------- ------- ------- -------
total kB             988     612      40

通过查看进程的内存分布,可以了解哪些地址是有效的,可写的;这对于调试有一定帮助。

2019年终总结

这一年除了工作,就是为家里的事奔波操劳,真是心力交瘁。年初的时候还想着今年多参加一些技术会议,结果一次都没去成:-)。

年中的时候换了工作,目前感觉还好。

所有的业余项目都是在上半年完成的:主要是一些技术教程,代码很少。有点里程碑意义的事是经过将近6年的坚持,写了超过300篇的英文博客。

忙里偷闲看了一些小说。

今年的“第一次”:第一次去了广州;第一次从美国网站直接买东西。

就这些吧,看看明年这个时候会写些什么。

一分钟了解NetBSD

NetBSD操作系统是一个“麻雀虽小,五脏俱全”的开源项目。它支持很多硬件平台,包括早在2000年就已经退出历史舞台的VAX。另外它也有自己的基金会,用来筹措资金,保证NetBSD项目的运行。就像OpenBSD衍生出OpenSSHLibreSSL等项目一样,NetBSDpkgsrc也已被移植到多个系统上,并且每年还有专门的大会。最后,NetBSD的博客不仅有关于NetBSD项目的最新进展,还有很多关于内核,LLVM的相关文章,值得一看。

pkgsrc与IPS

pkgsrc是一个用来安装第三方软件的的框架,它集成了编译,安装,删除应用等功能。pkgsrc发源于NetBSD,但现在已经移植到多个操作系统,比如OpenBSD。通常来讲,使用pkgsrc安装软件有两种方式:直接安装已经编译好的二进制包,即pkg;或者是下载源码自己编译安装,即src。在使用pkgsrc框架的系统上,pkg_add(1)命令用来安装软件;pkg_delete(1)用来移除软件。

pkgin项目是用来管理pkgsrc的二进制包的工具,其类似于Linux系统上的apt/yum。”pkgin install“用来安装软件;”pkgin remove“用来移除软件。如果你使用pkgsrc框架,你既可以选择使用pkgsrc自带的pkg_*命令来管理安装软件,也可以安装pkgin,然后通过pkgin来管理。

除了pkgsrcSun/Oracle也有一个类似的框架:IPS(Image Packaging System),其主要应用于Solaris及其衍生的操作系统。IPS使用pkg(5)命令来管理软件包:”pkg install“用来安装软件;”pkg uninstall“用来卸载软件。注意同pkgsrcpkg_*命令相区分。有趣的是,基于OpenSolaris/illumos的发行版中,OmniOSOpenIndiana使用IPS,而SmartOS则使用pkgsrc

References:
pkgsrc;
The pkgsrc guide;
pkgin;
Image Packaging System.

再见,A*公司

由于我之前工作的一家公司同样以A开头,为了以示区分,就把现在这家公司称之为A*吧。

今天是我在A*工作的最后一天,从2016125日入职,到今天整整工作了949天,又是一段美好的回忆。

同之前的H公司A公司一样,团队氛围很好,像个家庭,工作上互相帮助,我也学到了不少东西:

(1)密码学和安全;
(2)OpenMPCUDA等并行计算领域;
(3)现代C++modern C++)。

另外由于团队文化是“结果导向”,因此我可以自由安排我的时间,只要按时完成任务就行。我在下面领域也开阔了自己的视野:

(1)试用了各种BSD以及illumos操作系统;
(2)学习了RustnewLisp编程语言。不过语言这种东西,长时间不用就会忘掉,:-);
(3)继续深入系统性能调试方面的研究;

业余时间也做了几个开源小项目,写了几本英文技术教程。此外,A*让我有了第一次出差经历,还是国外:英国伦敦。

最后祝团队的朋友生活越来越好,也祝A*公司越来越好!

docker笔记(18)——如何创建新的image

(1)通过当前运行的container创建image

# docker commit 281e7d886185 <docker image name>

(2)压缩image

# docker save <docker image name> | gzip > <docker image name>.tar.gz

(3)加载image

# zcat <docker image name>.tar.gz | docker load

参考资料:
HOW TO CREATE A DOCKER IMAGE FROM A CONTAINER
How to copy Docker images from one host to another without using a repository

 

Tmux简明手册

screen类似,tmux也用来管理多个终端回话。常用的就是下面几个命令:

(1)创建新会话:

# tmux

创建时指定会话的名字(2是会话名字),多用于复用之前已经退出会话的名字:

# tmux new -s 2  

(2)离开(detach)会话:先输入Ctrl + b,然后输入d
(3)列出当前管理的所有会话(冒号前面的是会话名字):

# tmux ls
0: 1 windows (created Wed Jul  3 15:08:44 2019) [88x29]
1: 1 windows (created Wed Jul  3 16:29:19 2019) [120x39]

(4)附着(attach)某个会话(2是会话名字):

# tmux a -t 2

(5)杀死某个会话(2是会话名字):

# tmux kill-session -t 2

参考资料:
A Gentle Introduction to tmux
tmux cheatsheet

关于工资的一个有趣现象

根据我的个人经验,在一些中小企业中(人数在100人上下,或者一些人数更少的初创公司),已经盈利公司的待遇往往要少于一些还在靠“风投”不断注血的公司。原因可能是随着公司已经开始赚钱,投资方开始撤出,这时花的就是自己的钱了,要节省一下。没赚钱之前,基本上花的就是投资方的钱,自己没多少损失,无所谓,该花花。