Kernel学习笔记

这是有关Kernel的学习笔记,也就是说会很乱......

查看Kernel版本

[root@vserver1 ~]# uname -a
Linux vserver1.intern.com 2.6.32-504.el6.x86_64 #1 SMP Tue Sep 16 01:56:35 EDT 2014 x86_64 x86_64 x86_64 GNU/Linux
[root@vserver1 ~]# 
[root@vserver1 ~]# uname -r
2.6.32-504.el6.x86_64
[root@vserver1 ~]# 
[root@vserver1 ~]# lsb_release -a
LSB Version:	:base-4.0-amd64:base-4.0-noarch:core-4.0-amd64:core-4.0-noarch:graphics-4.0-amd64:graphics-4.0-noarch:printing-4.0-amd64:printing-4.0-noarch
Distributor ID:	RedHatEnterpriseServer
Description:	Red Hat Enterprise Linux Server release 6.5 (Santiago) -shiken
Release:	6.5
Codename:	Santiago

也可以从/var/log/dmesg中查看。


查看设备

low-level LVM managerment.

[root@vserver1 ~]# dmsetup info -c
Name                Maj Min Stat Open Targ Event  UUID                                                                     
vg1-lvm1            253   2 L--w    0    1      0 LVM-oE0I0UMbhEkRFQbq2r4cKzuQROCMWSBpimxX1ASrJyfeMu53lf7fh2dDDc56G5vq     
vg1-lvm2snap        253   6 L--w    0    1      0 LVM-oE0I0UMbhEkRFQbq2r4cKzuQROCMWSBpseWbOqXQNR2fsNPvKhBFfL15JKmTYfx2     
vg1-lvm2-real       253   3 L--w    2    1      0 LVM-oE0I0UMbhEkRFQbq2r4cKzuQROCMWSBpYOAFw9wuK1vIq1KMntaLmh8fbI8wEsuM-real
vg_vserver1-lv_swap 253   1 L--w    1    1      0 LVM-c1RqhVetHvaaJE1S1U56Up4vXE18YAEqn3tdom2ugNQB14eGwPuYEMt2rlGX2jH9     
vg_vserver1-lv_root 253   0 L--w    1    1      0 LVM-c1RqhVetHvaaJE1S1U56Up4vXE18YAEqjp0xcC6CTqi24h1FcXlmIJbxqjz6OaKe     
vg1-lvm2snap-cow    253   5 L--w    1    1      0 LVM-oE0I0UMbhEkRFQbq2r4cKzuQROCMWSBpseWbOqXQNR2fsNPvKhBFfL15JKmTYfx2-cow 
vg1-lvm2            253   4 L--w    0    1      0 LVM-oE0I0UMbhEkRFQbq2r4cKzuQROCMWSBpYOAFw9wuK1vIq1KMntaLmh8fbI8wEsuM 

看挂载

[root@vserver1 ~]# cat /proc/mounts 
rootfs / rootfs rw 0 0
proc /proc proc rw,relatime 0 0
sysfs /sys sysfs rw,seclabel,relatime 0 0
devtmpfs /dev devtmpfs rw,seclabel,relatime,size=434528k,nr_inodes=108632,mode=755 0 0
devpts /dev/pts devpts rw,seclabel,relatime,gid=5,mode=620,ptmxmode=000 0 0
tmpfs /dev/shm tmpfs rw,seclabel,relatime 0 0
/dev/mapper/vg_vserver1-lv_root / ext4 rw,seclabel,relatime,barrier=1,data=ordered 0 0
none /selinux selinuxfs rw,relatime 0 0
devtmpfs /dev devtmpfs rw,seclabel,relatime,size=434528k,nr_inodes=108632,mode=755 0 0
/proc/bus/usb /proc/bus/usb usbfs rw,relatime 0 0
/dev/sda1 /boot ext4 rw,seclabel,relatime,barrier=1,data=ordered 0 0
/dev/sr0 /mnt/yum iso9660 ro,relatime 0 0
none /proc/sys/fs/binfmt_misc binfmt_misc rw,relatime 0 0
sunrpc /var/lib/nfs/rpc_pipefs rpc_pipefs rw,relatime 0 0
/etc/auto.misc /misc autofs rw,relatime,fd=6,pgrp=1537,timeout=300,minproto=5,maxproto=5,indirect 0 0
-hosts /net autofs rw,relatime,fd=12,pgrp=1537,timeout=300,minproto=5,maxproto=5,indirect 0 0
nfsd /proc/fs/nfsd nfsd rw,relatime 0 0
gvfs-fuse-daemon /root/.gvfs fuse.gvfs-fuse-daemon rw,nosuid,nodev,relatime,user_id=0,group_id=0 0 0

看模块

[root@vserver1 ~]# lsmod

或者

[root@vserver1 ~]# cat /proc/modules

内核参数

可以直接看某个参数

[root@vserver1 ~]# cat /proc/modules

用命令看所有参数

[root@vserver1 ~]# sysctl -a | less

PID是按最小的可用进程号进行分配的。


Kernel Panic

下面这些值可以定义触发kernel panic的条件,方便收集vmcore.
/usr/share/doc/kernel-doc-2.6.32/Documentation/sysctl/kernel.txt 可以找到这些值的说明。

[root@vserver1 ~]# sysctl -a | grep panic
kernel.panic = 0
kernel.panic_on_oops = 1
kernel.softlockup_panic = 0
kernel.unknown_nmi_panic = 0
kernel.panic_on_unrecovered_nmi = 0
kernel.panic_on_io_nmi = 0
kernel.hung_task_panic = 0
vm.panic_on_oom = 0

vm.panic_on_oom表示内存不足时触发panic.
kernel.unknown_nmi_panic可以由硬件nmi触发panic.


swap

[root@host ~]# sysctl -a | grep swap
vm.swappiness = 60

swappiness可以调节kernel使用swap的欲望,默认值是60.
如果设成100,则会尽可能地多使用swap;
如果设成0,则尽可能不用swap;


进程

VSZ / RSS
用ps -aux 查看进程。
VSZ表示进程所申请的内存的大小,RSS表示实际mapping到物理内存的大小。

看线程,其中LWP可以理解为线程id。

[root@vserver1 ~]# ps -eLf

实时进程

# chrt -p pid

在Linux中,进程和线程一视同仁,每个线程都有PID。
tgid(Thread group id)可以看作“进程号”。

内核模块

比如说usb驱动模块,是U盘等设备插入时加载的模块。
看模块的方法有很多。

[root@host ~]# lsmod
[root@host ~]# lspci
[root@host ~]# lspci -vvn
[root@host ~]# modinfo <module>
[root@host ~]# depmod -a      #重建modules.dep
[root@host ~]# cat /usr/share/hwdata/pci.ids | less

手动加载模块

# modprob

手动卸载模块

# rmmod

DMI table decoder

[root@host ~]# dmidecode

initrd

Rebuild initrd for current kernel.

[root@vserver1 ~]# dracut -f -v

Rebuild for different kernel or in rescue mode

# dracut -f < initrd filename > < kernel version >

sysvinit, UpStart, Systemd

参考:浅析 Linux 初始化 init 系统
https://www.ibm.com/developerworks/cn/linux/1407_liuming_init1/
http://www.ibm.com/developerworks/cn/linux/1407_liuming_init2/
http://www.ibm.com/developerworks/cn/linux/1407_liuming_init3/index.html


ulimit

看各Limit含义

[root@vserver1 ~]# man getrlimit

Cache

用 free -m 命令看到free小,并不代表内存可用空间少。
在进程需要更多物理内存时,Cache和buffer会被释放,腾出空间。

Cache和Buffer是为提高性能而存在的,所以不建议手动清除。
不过我们是可以手动清除的...

Writing to this will cause the kernel to drop clean caches, dentries and
inodes from memory, causing that memory to become free.

To free pagecache:
echo 1 > /proc/sys/vm/drop_caches
To free dentries and inodes:
echo 2 > /proc/sys/vm/drop_caches
To free pagecache, dentries and inodes:
echo 3 > /proc/sys/vm/drop_caches

As this is a non-destructive operation and dirty objects are not freeable, the
user should run `sync' first.


内存不足时杀进程

[root@host ~]# cat /proc/6885/oom_score
1
[root@host ~]# 
[root@host ~]# cat /proc/1/oom_score
0

内存严重不足时,kernel会自动杀掉“不重要”的进程。
进程的不重要程度,可以从/proc//oom_score中查看,score越高,越容易被杀掉。


System Call

追踪system call

# strace

Network Stack

Transmission

1. Data -> Socket, put in the transmit buffer;
2. Kernel encapsulate the data into PDU;
3. PDU move to pre-drive transmit queue;(NIC)
4. Network device driver PDU -> sent;
5. NIC sends raise interrupt.

Reception

1. NIC receive frame DMA -> receive buffer;
2. NIC raise hard interrupt;
3. CPU get hard interrupt, schedule soft interrupt to handle packet;
4. Soft interrupt. Packet -> IP Layer;
5. PDU decapsulate. Socket receive buffer -> process.

相关内核参数
net.core.wmem_max
net.core.rmem_max

加静态路由
/etc/sysconfig/network-scripts/route-


I/O

看IO情况用命令 blktrace

[root@host ~]# iostat -x
Linux 2.6.32-431.el6.x86_64 (host.intern.com) 	12/23/2014 	_x86_64_	(4 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           3.87    0.00    1.33    0.49    0.00   94.31

Device:         rrqm/s   wrqm/s     r/s     w/s   rsec/s   wsec/s avgrq-sz avgqu-sz   await  svctm  %util
sda               0.75     8.20    3.89    2.18   274.86   102.58    62.22     0.04    5.97   3.88   2.36
dm-0              0.00     0.00    4.44   10.20   271.04   102.58    25.52     0.10    6.84   1.60   2.34

I/O stack

Application
--------
syscall
VFS/Cache
FileSystem
DM/MD
Block Layer
I/O Scheduler(Merge) -> nr_request(queue)
(DM-multipath)
Driver -> queue_depth
---------
Controller
Transport
Storage

修改队列长度

/sys/block/sda/queue/nr_request
/sys/block/sda/queue/scheduler (调度算法)