Linux上下文切换监控

我们在监测Linux的应用的时候,当CPU的利用率非常高,但是系统的性能却上不去的时候,不妨监控一下线程/进程的切换,看看是不是context switching导致的overhead过高。

一般我使用dstat工具用来监控,比如dstat -y:

1
2
3
4
5
---system--
int csw
367 561
274 439
279 363

或者vmstat 3:

1
2
3
4
[root@abc smallnest]# vmstat 3
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 0 3126192 31692 1521612 0 0 176 325 166 258 1 1 96 3 0

但是如何知道那些进程/线程做切换能,淘宝褚霸有篇文章:latencytop深度了解你的Linux系统的延迟介绍了一种方法。事实上,有一个工具pidstat,可以用来监控上下文切换。 它是sysstat包其中的一个工具,sysstat包含好几个很棒的工具,比如sar、iostat等。

执行pidstat -w

1
2
3
4
5
6
7
8
9
10
11
12
13
14
root@abc smallnest]# pidstat -w
Linux 2.6.32-358.el6.x86_64 (abc) 04/11/2016 _x86_64_ (2 CPU)
11:25:00 PM PID cswch/s nvcswch/s Command
11:25:00 PM 1 0.60 0.03 init
11:25:00 PM 2 0.04 0.00 kthreadd
11:25:00 PM 3 0.36 0.00 migration/0
11:25:00 PM 4 0.58 0.00 ksoftirqd/0
11:25:00 PM 5 0.01 0.00 migration/0
11:25:00 PM 6 0.08 0.00 watchdog/0
11:25:00 PM 7 0.39 0.00 migration/1
11:25:00 PM 8 0.01 0.00 migration/1
11:25:00 PM 9 0.52 0.00 ksoftirqd/1
……

cswch/s是主动地上下文切换,nvcswch/s是被动执行上下文切换的次数。

如要要显示线程的上下文切换统计,可以执行``:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@abc smallnest]# pidstat -wt
Linux 2.6.32-358.el6.x86_64 (abc) 04/11/2016 _x86_64_ (2 CPU)
11:27:57 PM TGID TID cswch/s nvcswch/s Command
11:27:57 PM 1 - 0.56 0.03 init
11:27:57 PM - 1 0.56 0.03 |__init
11:27:57 PM 2 - 0.03 0.00 kthreadd
11:27:57 PM - 2 0.03 0.00 |__kthreadd
11:27:57 PM 3 - 0.34 0.00 migration/0
11:27:57 PM - 3 0.34 0.00 |__migration/0
11:27:57 PM 4 - 0.57 0.00 ksoftirqd/0
11:27:57 PM - 4 0.57 0.00 |__ksoftirqd/0
11:27:57 PM 5 - 0.01 0.00 migration/0
……

更多的参数可以man pidstat获得。

在 Linux 上如何清除内存的 Cache、Buffer 和交换空间

英文原文: How to Clear RAM Memory Cache, Buffer and Swap Space on Linux,
中文翻译: 在 Linux 上如何清除内存的 Cache、Buffer 和交换空间 by strugglingyouth
像任何其他的操作系统一样,GNU/Linux 已经实现的内存管理不仅有效,而且更好。但是,如果有任何进程正在蚕食你的内存,而你想要清除它的话,Linux 提供了一个刷新或清除RAM缓存方法。

阅读全文

Virtualbox mount共享文件夹错误

最近创建了一个Centos 7的虚拟机,使用的是virtualbox 版本 5.0.6 r103037。
安装了增强包之后,依然无法挂载共享文件夹,报错如下:

1
2
[...]# mount -t vboxsf share /mnt/share
/sbin/mount.vboxsf: mounting failed with the error: No such device

用redhat 6.4是正常的。
stackoverflow有人也遇到了这个问题,解决办法如下:

1
modprobe -a vboxguest vboxsf vboxvideo

特别记录下来以备将来查询。

你也可以在/etc/modules-load.d/创建要加载的模块,一个文件加载一个模块,如:

1
2
3
4
/etc/modules-load.d/vboxsf.conf
# Load vboxsf.ko at boot
vboxsf

这样启动的时候就将相应的模块加载进来了。

Linux Signal及Golang中的信号处理

信号(Signal)是Linux, 类Unix和其它POSIX兼容的操作系统中用来进程间通讯的一种方式。一个信号就是一个异步的通知,发送给某个进程,或者同进程的某个线程,告诉它们某个事件发生了。
当信号发送到某个进程中时,操作系统会中断该进程的正常流程,并进入相应的信号处理函数执行操作,完成后再回到中断的地方继续执行。
如果目标进程先前注册了某个信号的处理程序(signal handler),则此处理程序会被调用,否则缺省的处理程序被调用。

阅读全文

使用cgroups限制MongoDB的内存使用

cgroups,其名称源自控制组群(control groups)的简写,是Linux内核的一个功能,用来限制,控制与分离一个进程组群的资源(如CPU、内存、磁盘输入输出等)。

这个项目最早是由Google的工程师在2006年发起(主要是Paul Menage和Rohit Seth),最早的名称为进程容器(process containers)。在2007年时,因为在Linux内核中,容器(container)这个名词有许多不同的意义,为避免混乱,被重命名为cgroup,并且被合并到2.6.24版的内核中去。自那以后,又添加了很多功能。

使​​​用​​​ cgroup,系​​​统​​​管​​​理​​​员​​​可​​​更​​​具​​​体​​​地​​​控​​​制​​​对​​​系​​​统​​​资​​​源​​​的​​​分​​​配​​​、​​​优​​​先​​​顺​​​序​​​、​​​拒​​​绝​​​、​​​管​​​理​​​和​​​监​​​控​​​。​​​可​​​更​​​好​​​地​​​根​​​据​​​任​​​务​​​和​​​用​​​户​​​分​​​配​​​硬​​​件​​​资​​​源​​​,提​​​高​​​总​​​体​​​效​​​率​​​。
在实践中,系统管理员一般会利用cgroup做下面这些事:

  • 隔离一个进程组(比如:nginx的所有进程),并限制他们所消费的资源,比如绑定CPU的核。
  • 为这组进程 分配其足够使用的内存
  • 为这组进程分配相应的网络带宽和磁盘存储限制
  • 限制访问某些设备(通过设置设备的白名单)

阅读全文