这是有关Kernel的学习笔记,也就是说会很乱......
Contents
查看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[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/
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 (调度算法)