1.if 条件表达式

文件表达式
if [ -f  file ]    如果文件存在
if [ -d ...   ]    如果目录存在
if [ -s file  ]    如果文件存在且非空
if [ -r file  ]    如果文件存在且可读
if [ -w file  ]    如果文件存在且可写
if [ -x file  ]    如果文件存在且可执行
整数变量表达式
if [ int1 -eq int2 ]    如果int1等于int2
if [ int1 -ne int2 ]    如果不等于
if [ int1 -ge int2 ]       如果>=
if [ int1 -gt int2 ]       如果>
if [ int1 -le int2 ]       如果<=
if [ int1 -lt int2 ]       如果<
字符串变量表达式
If  [ $a = $b ]                 如果string1等于string2 字符串允许使用赋值号做等号
if  [ $string1 !=  $string2 ]   如果string1不等于string2
if  [ -n $string  ]             如果string 非空(非0),返回0(true)
if  [ -z $string  ]             如果string 为空
if  [ $sting ]                  如果string 非空,返回0 (和-n类似)
逻辑运算符
-a  && 与
-o  || 或
!   !  非

2.route 命令可以查看 Linux 内核路由表

U — 路由是活动的
H — 目标是一个主机
N — 目标时某个网段
G — 路由指向网关
R — 恢复动态路由产生的表项
D — 由路由的后台程序动态地安装
M — 由路由的后台程序修改
! — 拒绝路由

3.awk 行处理器 依次对每一行进行处理,然后输出

$0           表示整个当前行
$1           每行第一个字段
NF          字段数量变量
NR          每行的记录号,多文件记录递增
FNR        与NR类似,不过多文件记录不递增,每个文件都从1开始
\t            制表符
\n           换行符
FS          BEGIN时定义分隔符
RS       输入的记录分隔符, 默认为换行符(即文本是按一行一行输入)
~            匹配,与==相比不是精确比较
!~           不匹配,不精确比较
==         等于,必须全部相等,精确比较
!=           不等于,精确比较
&&      逻辑与
||             逻辑或
+            匹配时表示1个或1个以上
/[0-9][0-9]+/   两个或两个以上数字
/[0-9][0-9]*/    一个或一个以上数字
FILENAME 文件名
OFS      输出字段分隔符, 默认也是空格,可以改为制表符等
ORS        输出的记录分隔符,默认为换行符,即处理结果也是一行一行输出到屏幕
-F'[:#/]'   定义三个分隔符
print 是awk打印指定内容的主要命令

4.函数调用

testFun(){
    echo $1
}
param="helloworld!"
testFun $param
$# 传递到脚本的参数个数
$* 以一个单字符串显示所有向脚本传递的参数
$$ 脚本运行的当前进程ID号
$! 后台运行的最后一个进程的ID号
$@ 与$*相同,但是使用时加引号,并在引号中返回每个参数.
$- 显示Shell使用的当前选项,与set命令功能相同.
$? 显示最后命令的退出状态.0表示没有错误,其他任何值表明有错误.

5.proc/net/dev中每一项的含义是
bytes:接口发送或接收的数据的总字节数
packets:接口发送或接收的数据包总数
errs:由设备驱动程序检测到的发送或接收错误的总数
drop:设备驱动程序丢弃的数据包总数
fifo:FIFO缓冲区错误的数量
frame:分组帧错误的数量
colls:接口上检测到的冲突数
compressed:设备驱动程序发送或接收的压缩数据包数
carrier:The number of carrier losses detected by the device driver.(由设备驱动程序检测到的载波损耗的数量)
multicast:The number of multicast frames transmitted or received by the device driver.(设备驱动程序发送或接收的多播帧数)

6. grep 命令用于查找文件里符合条件的字符串.

-a 或 --text:不要忽略二进制的数据.
-A<显示行数> 或 --after-context=<显示行数>:除了显示符合范本样式的那一列之外,并显示该行之后的内容.
-b 或 --byte-offset:在显示符合样式的那一行之前,标示出该行第一个字符的编号.
-B<显示行数> 或 --before-context=<显示行数>:除了显示符合样式的那一行之外,并显示该行之前的内容.
-c 或 --count:计算符合样式的列数.
-C<显示行数> 或 --context=<显示行数>或-<显示行数>:除了显示符合样式的那一行之外,并显示该行之前后的内容.
-d <动作> 或 --directories=<动作>:当指定要查找的是目录而非文件时,必须使用这项参数,否则grep指令将回报信息并停止动作.
-e<范本样式> 或 --regexp=<范本样式>:指定字符串做为查找文件内容的样式.
-E 或 --extended-regexp:将样式为延伸的正则表达式来使用.
-f<规则文件> 或 --file=<规则文件>:指定规则文件,其内容含有一个或多个规则样式,让grep查找符合规则条件的文件内容,格式为每行一个规则样式.
-F 或 --fixed-regexp:将样式视为固定字符串的列表.
-G 或 --basic-regexp:将样式视为普通的表示法来使用.
-h 或 --no-filename:在显示符合样式的那一行之前,不标示该行所属的文件名称.
-H 或 --with-filename:在显示符合样式的那一行之前,表示该行所属的文件名称.
-i 或 --ignore-case:忽略字符大小写的差别.
-l 或 --file-with-matches:列出文件内容符合指定的样式的文件名称.
-L 或 --files-without-match:列出文件内容不符合指定的样式的文件名称.PREROUTING
-n 或 --line-number:在显示符合样式的那一行之前,标示出该行的列数编号.
-o 或 --only-matching:只显示匹配PATTERN 部分.
-q 或 --quiet或--silent:不显示任何信息.
-r 或 --recursive:此参数的效果和指定"-d recurse"参数相同.
-s 或 --no-messages:不显示错误信息.
-v 或 --invert-match:显示不包含匹配文本的所有行.
-V 或 --version:显示版本信息.
-w 或 --word-regexp:只显示全字符合的列.
-x --line-regexp:只显示全列符合的列.
-y:此参数的效果和指定"-i"参数相同.

7 iptables https://blog.csdn.net/zzhongcy/article/details/42738285

7.1 iptables基础
规则(rules):网络管理员预定义的条件
链(chains):是数据包传播的路径
表(tables):内置3个表filter表,nat表,mangle表分别用于实现包过滤网络地址转换和包重构的功能
filter表是系统默认的,INPUT表(进入的包),FORWORD(转发的包),OUTPUT(处理本地生成的包),filter表只能对包进行授受和丢弃的操作.
nat表(网络地址转换),PREROUTING(修改即将到来的数据包),OUTPUT(修改在路由之前本地生成的数据包),POSTROUTING(修改即将出去的数据包)
mangle表,PREROUTING,OUTPUT,FORWORD,POSTROUTING,INPUT
7.2 iptables命令格式
iptables [-t 表] -命令 匹配 操作 (大小写敏感)
表名包括:
    raw:高级功能,如:网址过滤.
    mangle:数据包修改(QOS),用于实现服务质量.
    net:地址转换,用于网关路由器.
    filter:包过滤,用于防火墙规则.
规则链名包括:
    INPUT链:处理输入数据包.
    OUTPUT链:处理输出数据包.
    PORWARD链:处理转发数据包.
    PREROUTING链:用于目标地址转换(DNAT).
    POSTOUTING链:用于源地址转换(SNAT).
动作选项
    ACCEPT          接收数据包
    DROP             丢弃数据包
    REDIRECT      将数据包重新转向到本机或另一台主机的某一个端口,通常功能实现透明代理或对外开放内网的某些服务
    SNAT             源地址转换
    DNAT             目的地址转换
    MASQUERADE       IP伪装
    LOG               日志功能
7.2 定义规则
先拒绝所有的数据包,然后再允许需要的数据包
    iptalbes -P INPUT DROP
    iptables -P FORWARD DROP
    iptables -P OUTPUT ACCEPT
查看nat表所有链的规则列表
    iptables -t nat -L
增加,插入,删除和替换规则
    iptables [-t 表名] <-A|I|D|R> 链名 [规则编号] [-i|o 网卡名称] [-p 协议类型] [-s 源ip|源子网] [--sport 源端口号] [-d 目的IP|目标子网] [--dport 目标端口号] [-j 动作]
        -t<表>:指定要操纵的表;
        -A:向规则链中添加条目;
        -D:从规则链中删除条目;
        -i:向规则链中插入条目;
        -R:替换规则链中的条目;
        -L:显示规则链中已有的条目;
        -F:清楚规则链中已有的条目;
        -Z:清空规则链中的数据包计算器和字节计数器;
        -N:创建新的用户自定义规则链;
        -P:定义规则链中的默认目标;
        -h:显示帮助信息;
        -p:指定要匹配的数据包协议类型;
        -s:指定要匹配的数据包源ip地址;
        -j<目标>:指定要跳转的目标;
        -i<网络接口>:指定数据包进入本机的网络接口;
        -o<网络接口>:指定数据包要离开本机所使用的网络接口.
iptables -nvx -L:查看规则

8 sed https://blog.csdn.net/wdz306ling/article/details/80087889

sed的常用选项:
    -r:使用扩展正则表达式
    -e:它告诉sed将下一个参数解释为一个sed指令,只有当命令行上给出多个sed指令时才需要使用-e选项
    -f:后跟保存了sed指令的文件
    -n:取消默认输出,sed默认会输出所有文本内容,使用-n参数后只显示处理过的行
sed中的编辑命令:
    a:追加  向匹配行后面插入内容
    c:更改  更改匹配行的内容
    i:插入  向匹配行前插入内容
    d:删除  删除匹配的内容
    s:替换  替换掉匹配的内容
    p:打印  打印出匹配的内容,通常与-n选项和用
    =:用来打印被匹配的行的行号
    n:读取下一行,遇到n时会自动跳入下一行
    r,w:读和写编辑命令,r用于将内容读入文件,w用于将匹配内容写入到文件
    sed -i 's/原字符串/新字符串/' /home/1.txt   # 替换第一行匹配到的第一次
    sed -i 's/原字符串/新字符串/g' /home/1.txt  # 替换文本中所有的
    sed -i '/字符串/d' /home/1.txt  # 删除特定字符
    sed -i '$a\hive - nproc 65535' /home/1.txt  # 最后一行插入数据

9 chkconfig命令主要用来更新(启动或停止)和查询系统服务的运行级信息

使用语法:
    chkconfig [--add][--del][--list][系统服务] 或 chkconfig [--level <等级代号>][系统服务][on/off/reset]
    chkconfig在没有参数运行时,显示用法。如果加上服务名,那么就检查这个服务是否在当前运行级启动。如果是,返回true,否则返回false。如果在服务名后面指定了on,off或者reset,那么chkconfi 会改变指定服务的启动信息。on和off分别指服务被启动和停止,reset指重置服务的启动信息,
无论有问题的初始化脚本指定了什么。on和off开关,系统默认只对运行级3,4,5有效,但是reset可以对所有运行级有效。 参数用法: --add  增加所指定的系统服务,让chkconfig指令得以管理它,并同时在系统启动的叙述文件内增加相关数据。 --del  删除所指定的系统服务,不再由chkconfig指令管理,并同时在系统启动的叙述文件内删除相关数据。 --level<等级代号>  指定读系统服务要在哪一个执行等级中开启或关毕。 等级0表示:表示关机 等级1表示:单用户模式 等级2表示:无网络连接的多用户命令行模式 等级3表示:有网络连接的多用户命令行模式 等级4表示:不可用 等级5表示:带图形界面的多用户模式 等级6表示:重新启动 需要说明的是,level选项可以指定要查看的运行级而不一定是当前运行级。对于每个运行级,只能有一个启动脚本或者停止脚本。当切换运行级时,init不会重新启动已经启动的服务,也不会再次去停止已经停止的服务。 chkconfig --list [name]:显示所有运行级系统服务的运行状态信息(on或off)。如果指定了name,那么只显示指定的服务在不同运行级的状态。 chkconfig --add name:增加一项新的服务。chkconfig确保每个运行级有一项启动(S)或者杀死(K)入口。如有缺少,则会从缺省的init脚本自动建立。 chkconfig [--level levels] name:设置某一服务在指定的运行级是被启动,停止还是重置。 使用范例: chkconfig --list #列出所有的系统服务 chkconfig --add httpd #增加httpd服务 chkconfig --del httpd #删除httpd服务 chkconfig --level httpd 2345 on #设置httpd在运行级别为2、3、4、5的情况下都是on(开启)的状态 chkconfig --list #列出系统所有的服务启动情况 chkconfig --list mysqld #列出mysqld服务设置情况 chkconfig --level 35 mysqld on #设定mysqld在等级3和5为开机运行服务,--level 35表示操作只在等级3和5执行,on表示启动,off表示关闭 chkconfig mysqld on #设定mysqld在各等级为on,“各等级”包括2、3、4、5等级 设置on能开启自启 如何增加一个服务: 1.服务脚本必须存放在/etc/ini.d/目录下; 2.chkconfig --add servicename 在chkconfig工具服务列表中增加此服务,此时服务会被在/etc/rc.d/rcN.d中赋予K/S入口了; 3.chkconfig --level 35 mysqld on 修改服务的默认启动等级。

10 wc命令用于计算字数。

wc [-clw][--help][--version][文件...]
-c或--bytes或--chars 只显示Bytes数。
-l或--lines 显示行数。
-w或--words 只显示字数。
--help 在线帮助。
--version 显示版本信息。
wc testfile    # testfile文件的统计信息
3 92 598 testfile       # testfile文件的行数为3、单词数92、字节数598

11 eth0的网口上分析报告会输出到这些文件中 每秒数据量:

/sys/class/net/eth0/statistics/rx_packets:收到的数据包数据
/sys/class/net/eth0/statistics/tx_packets:传输的数据包数量
/sys/class/net/eth0/statistics/rx_bytes:接收的字节数
/sys/class/net/eth0/statistics/tx_bytes:传输的字节数
/sys/class/net/eth0/statistics/rx_dropped:收包时丢弃的数据包
/sys/class/net/eth0/statistics/tx_dropped:发包时丢弃的数据包

12 /proc/stat中包含系统启动以来的很多系统和内核的统计信息

name   user  nice   system      idle      iowait  irrq  softirq  steal guest guest_nice
cpu    60382   1     80032     198934063   2349     0     109      0     0       0
cpu0   2405    0     2084      4140924     682      0     6        0     0       0
...  # 此处较多冗余信息,简化之
cpu47  200     0     134       4147222     10       0     0        0     0       0

user   用户态时间  jiffies    一般/高优先级,仅统计nice<=0
nice   nice用户态时间  jiffies    低优先级,仅统计nice>0
system 内核态时间  jiffies
idle   空闲时间   jiffies    不包含IO等待时间
iowait I/O等待时间    jiffies    硬盘IO等待时间
irq    硬中断时间  jiffies
softirq    软中断时间  jiffies
steal  被盗时间   jiffies    虚拟化环境中运行其他操作系统上花费的时间(since Linux 2.6.11)
guest  来宾时间   jiffies    操作系统运行虚拟CPU花费的时间(since Linux 2.6.24)
guest_nice nice来宾时间   jiffies    运行一个带nice值的guest花费的时间(since Linux 2.6.33)

13 /proc/net/route 获取路由信息

cat /proc/net/route
Iface   Destination     Gateway         Flags   RefCnt  Use     Metric  Mask            MTU     Window  IRTT
ens160  00000000        FE6BA8C0        0003    0       0       100     00000000        0       0       0
docker0 000011AC        00000000        0001    0       0       0       0000FFFF        0       0       0
ens160  006BA8C0        00000000        0001    0       0       100     00FFFFFF        0       0       0
Iface:改路由表项对应的输出接口
Destination:目标网段或主机
Gateway:网关地址
Flags:标记
RefCnt:路由应用次数
Use:此路由被路由软件查找次数
Metric:路由距离,到制定网络所需的中转数

14 cut用来从标准输入或文本文件中剪切列或域。

cut [options] file1 file2
-c list  指定剪切字符数。  - c 1,5-7  剪切第1个字符,然后是第 5到第7个字符。
-f field  指定剪切域数。  -f 1 ,5  剪切 第1域,第5域。
-d  指定与空格和t a b键不同的域分隔符。

15 /proc/loadavg 各项数据的含义

/proc文件系统是一个虚拟的文件系统,不占用磁盘空间,它反映了当前操作系统在内存中的运行情况,查看/proc下的文件可以聊寄到系统的运行状态。查看系统平均负载使用“cat /proc/loadavg”命令,输出结果如下:
0.27 0.36 0.37 4/83 4828/
前三个数字大家都知道,是1、5、15分钟内的平均进程数(有人认为是系统负荷的百分比,其实不然,有些时候可以看到200甚至更多)。后面两个呢,一个的分子是正在运行的进程数,分母是进程总数;另一个是最近运行的进程ID号。

16 os.statvfs() 方法用于返回包含文件描述符fd的文件的文件系统的信息。

f_bsize: 文件系统块大小
f_frsize: 分栈大小
f_blocks: 文件系统数据块总数
f_bfree: 可用块数
f_bavail:非超级用户可获取的块数
f_files: 文件结点总数
f_ffree: 可用文件结点数
f_favail: 非超级用户的可用文件结点数
f_fsid: 文件系统标识 ID
f_flag: 挂载标记
f_namemax: 最大文件长度

17 /proc/meminfo是了解Linux系统内存使用状况的主要接口

MemTotal:          45964 kB    //所有可用的内存大小,物理内存减去预留位和内核使用。系统从加电开始到引导完成,firmware/BIOS要预留一些内存,内核本身要占用一些内存,最后剩下可供内核支配的内存就是MemTotal。这个值在系统运行期间一般是固定不变的,重启会改变。
MemFree:            1636 kB    //表示系统尚未使用的内存。
MemAvailable:       8496 kB    //真正的系统可用内存,系统中有些内存虽然已被使用但是可以回收的,比如cache/buffer、slab都有一部分可以回收,所以这部分可回收的内存加上MemFree才是系统可用的内存
Buffers:               0 kB    //用来给块设备做缓存的内存,(文件系统的 metadata、pages)
Cached:             7828 kB    //分配给文件缓冲区的内存,例如vi一个文件,就会将未保存的内容写到该缓冲区
SwapCached:            0 kB    //被高速缓冲存储用的交换空间(硬盘的swap)的大小
Active:            19772 kB    //经常使用的高速缓冲存储器页面文件大小
Inactive:           3128 kB    //不经常使用的高速缓冲存储器文件大小
Active(anon):      15124 kB    //活跃的匿名内存
Inactive(anon):       52 kB    //不活跃的匿名内存
Active(file):       4648 kB    //活跃的文件使用内存
Inactive(file):     3076 kB    //不活跃的文件使用内存
Unevictable:           0 kB    //不能被释放的内存页
Mlocked:               0 kB    //系统调用 mlock 家族允许程序在物理内存上锁住它的部分或全部地址空间。这将阻止Linux 将这个内存页调度到交换空间(swap space),即使该程序已有一段时间没有访问这段空间
SwapTotal:             0 kB    //交换空间总内存
SwapFree:              0 kB    //交换空间空闲内存
Dirty:                 4 kB    //等待被写回到磁盘的
Writeback:             0 kB    //正在被写回的
AnonPages:         15100 kB    //未映射页的内存/映射到用户空间的非文件页表大小
Mapped:             7160 kB    //映射文件内存
Shmem:               100 kB    //已经被分配的共享内存
Slab:               9236 kB    //内核数据结构缓存
SReclaimable:       2316 kB    //可收回slab内存
SUnreclaim:         6920 kB    //不可收回slab内存
KernelStack:        2408 kB    //内核消耗的内存
PageTables:         1268 kB    //管理内存分页的索引表的大小
NFS_Unstable:          0 kB    //不稳定页表的大小
Bounce:                0 kB    //在低端内存中分配一个临时buffer作为跳转,把位于高端内存的缓存数据复制到此处消耗的内存
WritebackTmp:          0 kB    //FUSE用于临时写回缓冲区的内存
CommitLimit:       22980 kB    //系统实际可分配内存
Committed_AS:     536244 kB    //系统当前已分配的内存
VmallocTotal:     892928 kB    //预留的虚拟内存总量
VmallocUsed:       29064 kB    //已经被使用的虚拟内存
VmallocChunk:     860156 kB    //可分配的最大的逻辑连续的虚拟内存

18 cat /etc/sysctl.conf

    kernel.sysrq = 0               ------------------是否启用kernel.sysrq(在大多数服务已无法响应的情况下,还能通过按键组合来完成一系列预先定义的系统操作,1启用,0禁用;
    kernel.core_uses_pid = 1       ------------------可以控制core文件的文件名中是否添加pid作为扩展(文件内容为1,表示添加pid作为扩展名,生成 的core文件格式为core.xxxx;为0则表示生成的 core文件同一命名为core);
    kernel.msgmnb  = 65536         ------------------限制一个队列的最大长度;
    kernel.msgmax  = 65536         ------------------限制一条消息的最大长度;
    kernel.shmmax  = 68719476736   ------------------最大共享内存段大小;
    kernel.shmall  = 4294967296    ------------------可以使用的共享内存的总量;
    kernel.shmmni  = 4096          ------------------整个系统共享内存段的最大数目;
    kernel.sem     = 250 32000 100 128 --------------每个信号对象集的最大信号对象数;系统范围内最大信号对象数;每个信号对象支持的最大操数;系统范围内最大信号对象集数;
    kernel.msgmni  = 256           ------------------决定了系统中同时运行的最大的消息队列的个数;
    fs.file-max    = 65536         ------------------系统级打开最大文件句柄的数量;
    net.ipv4.ip_forward     = 0    ------------------(0代表禁止进行IP转发;1代表可以进行IP转发);
    net.ipv4.conf.default.rp_filter = 1  ------------控制系统是否开启对数据包源地址的校验;
    net.ipv4.conf.default.accept_source_route = 0  --禁用icmp源路由选项;
    net.ipv4.tcp_syncookies = 1    ------------------表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭;
    net.ipv4.conf.all.forwarding = 0  ---------------0代表不转发源路由帧,若做NAT建议开启;
    net.ipv4.ip_local_port_range = 9000 65000  ------系统中的程序会选择这个范围内的端口来连接到目的端口(目的端口当然是用户指定的;
    net.ipv4.tcp_fin_timeout = 30  ------------------表示如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间,默认是60,降低这个值以提高系统性能;
    net.ipv4.tcp_max_syn_backlog = 8192  ------------定义backlog队列容纳的最大半连接数,如果配置高可以设置的更高;
    net.core.rmem_default   =   262144   ------------套接字接收缓冲区大小的缺省值;
    net.core.rmem_max       =   4194304  ------------套接字接收缓冲区大小的最大值;
    net.core.wmem_default   =   262144   ------------套接字发送缓冲区大小的缺省值;
    net.core.wmem_max       =   262144   ------------套接字发送缓冲区大小的最大值;
sysctl -p  修改配置后生效

19 IP 隧道 https://www.cnblogs.com/bakari/p/10564347.html

Linux 原生支持多种三层隧道,其底层实现原理都是基于 tun 设备。我们可以通过命令 ip tunnel help 查看 IP 隧道的相关操作。
Usage: ip tunnel { add | change | del | show | prl | 6rd } [ NAME ]
          [ mode { ipip | gre | sit | isatap | vti } ] [ remote ADDR ] [ local ADDR ]
          [ [i|o]seq ] [ [i|o]key KEY ] [ [i|o]csum ]
          [ prl-default ADDR ] [ prl-nodefault ADDR ] [ prl-delete ADDR ]
          [ 6rd-prefix ADDR ] [ 6rd-relay_prefix ADDR ] [ 6rd-reset ]
          [ ttl TTL ] [ tos TOS ] [ [no]pmtudisc ] [ dev PHYS_DEV ]

Where: NAME := STRING
       ADDR := { IP_ADDRESS | any }
       TOS  := { STRING | 00..ff | inherit | inherit/STRING | inherit/00..ff }
       TTL  := { 1..255 | inherit }
       KEY  := { DOTTED_QUAD | NUMBER }
可以看到,Linux 原生一共支持 5 种 IP 隧道。
    ipip:即 IPv4 in IPv4,在 IPv4 报文的基础上再封装一个 IPv4 报文。
    gre:即通用路由封装(Generic Routing Encapsulation),定义了在任意一种网络层协议上封装其他任意一种网络层协议的机制,IPv4 和 IPv6 都适用。
    sit:和 ipip 类似,不同的是 sit 是用 IPv4 报文封装 IPv6 报文,即 IPv6 over IPv4。
    isatap:即站内自动隧道寻址协议(Intra-Site Automatic Tunnel Addressing Protocol),和 sit 类似,也是用于 IPv6 的隧道封装。
    vti:即虚拟隧道接口(Virtual Tunnel Interface),是 cisco 提出的一种 IPsec 隧道技术。
实践 IPIP 隧道
    我们下面以 ipip 作为例子,来实践下 Linux 的隧道通信。本文以前文的 Linux 路由机制作为基础,不清楚 Linux 路由的可以先翻看下那篇文章再来看。
    实践之前,需要知道的是,ipip 需要内核模块 ipip.ko 的支持,通过 lsmod | grep ipip 查看内核是否加载,若没有则用 modprobe ipip 先加载,正常加载应该显示
        [root@by ~]# modprobe ipip
        [root@by ~]# lsmod | grep ipip
        ipip                   13465  0
        tunnel4                13252  1 ipip
        ip_tunnel              25163  1 ipip
    加载 ipip 模块后,就可以创建隧道了,方法是先创建一个 tun 设备,然后将该 tun 设备绑定为一个 ipip 隧道即可。

20 ip

    ip link show                     # 显示网络接口信息
    ip link set eth0 up             # 开启网卡
    ip link set eth0 down            # 关闭网卡
    ip link set eth0 promisc on      # 开启网卡的混合模式
    ip link set eth0 promisc offi    # 关闭网卡的混个模式
    ip link set eth0 txqueuelen 1200 # 设置网卡队列长度
    ip link set eth0 mtu 1400        # 设置网卡最大传输单元
    ip addr show     # 显示网卡IP信息
    ip addr add 192.168.0.1/24 dev eth0 # 设置eth0网卡IP地址192.168.0.1
    ip addr del 192.168.0.1/24 dev eth0 # 删除eth0网卡IP地址

    ip route show # 显示系统路由
    ip route add default via 192.168.1.254   # 设置系统默认路由
    ip route list                 # 查看路由信息
    ip route add 192.168.4.0/24  via  192.168.0.254 dev eth0 # 设置192.168.4.0网段的网关为192.168.0.254,数据走eth0接口
    ip route add default via  192.168.0.254  dev eth0        # 设置默认网关为192.168.0.254
    ip route del 192.168.4.0/24   # 删除192.168.4.0网段的网关
    ip route del default          # 删除默认路由
    ip route delete 192.168.1.0/24 dev eth0 # 删除路由

21 taskset 查询或设置进程(线程)绑定CPU(亲和性)

22 /proc/interrupts中的字段依次是逻辑中断号、中断在各CPU上发生的次数,中断所属父设备名称、硬件中断号、中断触发方式(电平或边沿)、中断名称

/proc/interrupts的具体实现查看代码kernel/irq/proc.c中函数show_interrupts
读取interrupts会依次显示irq编号,每个cpu对该irq的处理次数,中断控制器的名字,irq的名字,以及驱动程序注册该irq时使用的名字,

23 /proc/irq目录下面会为每个注册的irq创建一个以irq编号为名字的子目录,每个子目录下分别有以下条目:  

smp_affinity            irq和cpu之间的亲缘绑定关系;
smp_affinity_hint   只读条目,用于用户空间做irq平衡只用;
spurious                  可以获得该irq被处理和未被处理的次数的统计信息;
handler_name       驱动程序注册该irq时传入的处理程序的名字;
irq: Interrupt ReQuest中断请求,IRQ号决定了需要被CPU处理的优先级。IRQ号越小意味着优先级越高
smp:(Symmetric Multi-Processing)对称多处理结构的简称,是指在一个计算机上汇集了一组处理器(多CPU),各CPU之间共享内存子系统以及总线结构。可以理解为系统存在多个完全相同的CPU ,所有CPU共享总线,拥有自己的寄存器。对于内存和外部设备访问,由于共享总线,所以是共享的。
Linux 操作系统多个 CPU 共享在系统空间上映射相同,是完全对等的; 中断:是由硬件或软件发送的一种称为IRQ的信号,是一种CPU与硬件沟通的方式(还有另外一种叫轮询)中断是一种电信号,由硬件产生,并直接送到中断控制器上,然后再由中断控制器向CPU发送信号,CPU检测到该信号后,就中断当前的工作转而去处理中断。然后,处理器会通知操作系统已经产生中断,
这样操作系统就会对这个中断进行适当的处理。中断分为两个过程,中间以中断控制器作为分隔。上半部分即中断上半部,下半部分为中断下半部。上半部分大部分为所说的硬件中断,下半部分为软中断。

24 ip rule、ip route # https://blog.csdn.net/u012758088/article/details/76255543

1.查看策略数据库
    ip rule show
2.添加规则
    条件
        条件是用来决定哪类数据包可以符合这项规则,而可用来匹配的字段为Source IP、Destination IP、Type of Service、fwmark及dev等,这些字段的使用方式如下:
    Source IP
        根据来源端IP来决定数据包参考哪个路由表发送出去。以下两个示例分别指出,如果数据包的来源端IP是192.168.1.10,就参考路由表10;如果来源端IP为192.168.2.0/24网段的IP,就参考路由表20。
        ip rule add from 192.168.1.10 table 10
        ip rule add from 192.168.2.0/24 table 20
    Destination IP
        根据目的端IP来决定数据包参考哪个路由表发送出去。以下两个示例分别指出,如果数据包的目的端IP是168.95.1.1,就参考路由表10;如果目的端IP是168.95.0.0/24网段的IP,就参考路由表20。
        ip rule add to 168.95.1.1 table 10
        ip rule add to 168.96.0.0/24 table 20
    fwmark
        将fwmark作为匹配条件时,必须搭配Netfilter一起使用, 这看起来很麻烦, 却是最灵活的匹配条件。如图10-8所示,某公司对外有三条ADSL,我们希望所有HT T P 协议经由第一条ADS L ,SMTP及POP3经由第二条ADSL,其余流量则经由第三条ADSL。可以使用如下的命令组合来达到这样的目的:
        iptables -t mangle -A FORWARD -i eth3 -p tcp --dport 80 -j MARK --set-mark 1
        iptables -t mangle -A FORWARD -i eth3 -p tcp --dport 25 -j MARK --set-mark 2
        iptables -t mangle -A FORWARD -i eth3 -p tcp --dport 110 -j MARK --set-mark 2
        iptables -t mangle -A FORWARD -i eth3 -j MARK --set-mark 3
        ip rule add fwmark 1 table 1
        ip rule add fwmark 2 table 2
        ip rule add fwmark 3 table 3
        首先使用Netfilter的managle机制针对特定的数据包设置MARK值,在此将HTTP数据包的MARK值设置为1,SMTP及POP3数据包的MARK值设置为2,其余数据包则设置MARK值为3。接着,再根据fwmark条件来判断数据包的MARK值,如果MARK值为1,则参考路由表1将数据包送出;MAKR值为2时,则参考路由表2将数据包送出;
最后,MARK值为3的数据包则参考路由表3送出。 dev 最后,还可以使用数据包输入的接口来作为判断依据,如图10-9所示,我们希望凡是由eth2接口送入的数据包都由eth0接口转发出去,由eth3接口送入的数据包都由eth1接口转发出去。以下命令组合将能满足我们的要求: ip rule add dev eth2 table 1 ip rule add dev eth3 table 3 3.优先级别 我们执行ip rule show命令所显示内容的第一个字段就是优先级别,数字越小,代表优先级别越高,也代表这条规则可以排得越靠前,如此数据包在进行条件匹配时,就会越早匹配到这条规则,从输出的数据中,默认优先级别0、32766及32767已被占用,因此,在添加规则时,如果没有特别设置优先级别,那么,
优先级别默认会从32766开始递减,如32765、32764……,如果我们需要特别设置优先级别,可以在ip rule add命令的最后加上prio XXX参数 ip rule add from 192.168.1.0/24 table 1 prio 10 ip rule add from 192.168.2.0/24 table 2 prio 20 ip rule show 0: from all lookup local 10: from 192.168.1.0/24 lookup 1 20: from 192.168.2.0/24 lookup 2 32766: from all lookup main 32767: from all lookup default 4.删除规则 ip命令提供的删除规则的方式十分灵活,例如,要删除下列第2条规则,可以分别使用“优先级别”、“条件”及“路由表”当中任何一个唯一的值来设置所需删除的规则,如下: ip rule del prio 10 ip rule del from 192.168.1.0/24 ip rule del table 1 ip rule del from 192.168.1.0/24 table 1 prio 10 5.路由表管理 查看路由表之前,首先使用ip rule show命令来查看目前使用了哪些路由表,接着,再使用ip route show [table id | name]命令来查看路由表的内容。例如,可以使用ip route showtable main来查看路由表main的内容,如果省略路由表名称(如ip route show),会默认地查看路由表main的内容。 ip rule show 0: from all lookup local 32766: from all lookup main 32767: from all lookup default local:路由表local包含本机路由及广播信息。例如,在本机上执行ssh 127.0.0.1时,就会参考这份路由表的内容,在正常情况下,只要配置好网卡的网络设置,就会自动生成local路由表的内容,我们应该也不必修改其内容。 main:使用传统命令route -n所看到的路由表就是main的内容。Linux系统在默认情况下使用这份路由表的内容来传输数据包,因此,其内容极为重要,在正常情况下,只要配置好网卡的网络设置,就会自动生成main路由表的内容。 default:最后是default路由表,这个路由表在默认情况下内容为空;除非有特别的要求,否则保持其内容为空即可。 ip route show table main 10.10.15.0/25 dev eth0 proto kernel scope link src 10.10.15.46 192.168.1.0/24 dev eth1 proto kernel scope link src 192.168.1.10 default via 10.10.15.1 dev eth0 以下是图10-10路由表main的内容,因为在主机上有eth0及eth1两块网卡,且为其设置的IP分别是10.10.15.46/25及192.168.1.10/24,因此,路由表内的第.行即是告诉系统,如果有数据包要送到10.10.15.0/25这个网段,就直接将数据包由eth0接口送出即可,而本机临近这个网段的IP是10.10.15.46,
第.行则是设置到192.168.1.0/24的路由,其含义与第.行完全相同;以上这两行是只要将计算机网卡上的IP设置好,并在网络服务重启之后,默认就会生成的路由,无需特别的设置。最后一行.则指:如果数据包不是送往10.10.15.0/25及192.168.1.0/24网段,那么数据包将统一转发给10.10.15.1主机去处理,
而10.10.15.1就是我们在网络配置中所设置的“默认网关”。 6.添加路由 添加路由在此还是一样采用ip命令而不是route命令,下例首先使用ip route show.命令显示路由表main的内容,接着再使用ip route add命令将所需的路由添加到路由表main中.,最后再次使用ip route show命令将路由表main的内容打印出来,此时就可以在路由表main之中看到刚才添加的路由了。 ip route show table main 10.10.15.0/25 dev eth0 proto kernel scope link src 10.10.15.46 192.168.1.0/24 dev eth1 proto kernel scope link src 192.168.1.10 default via 10.10.15.1 dev eth0 ip route add 192.168.2.0/24 via 10.10.15.50 table main ip route show table main 10.10.15.0/25 dev eth0 proto kernel scope link src 10.10.15.46 192.168.2.0/24 via 10.10.15.50 dev eth0 192.168.1.0/24 dev eth1 proto kernel scope link src 192.168.1.10 default via 10.10.15.1 dev eth0 如果要添加的路由并未出现在现有的路由表中,又该如何处理呢?在此请先有一个概念,单纯添加路由表并无意义,因为新增出来的路由表,系统默认是不会去使用的,如果要将路由添加到main以外的路由表,只有先添加“规则”才能确定新的路由表名称(Table ID),有了新的路由表之后,才会把路由添加到新的路由表中。 我们使用下列示例来说明这个过程。首先使用ip rule show.来查询RPDB的当前状态,可以看到目前只有三条默认规则,接着,再使用ip rule add命令来添加一条规则.,此时系统内就多了一个有用的路由表,其路由表ID为10,我们可以立即使用ip route show命令来查看这个新的路由表.,其内容默认为空,
接着可以在这个新路由表中添加路由,在此使用iproute add命令来添加路由,我们决定凡是来自于192.168.2.0/24网段的数据包,都从eth1接口将数据包送离本机,因此,必须完整编写eth1接口的路由。首先将临近eth1接口的路由填入.,告诉系统本机与192.168.1.0/24网段的通信都通过eth1接口来处理,接着填入这个路由表的默认路由.,
最后使用ip route show命令显示路由表10的内容。 ip rule show 0: from all lookup local 32766: from all lookup main 32767: from all lookup default ip rule add from 192.168.2.0/24 table 10 ip route show table 10 ip route add 192.168.1.0/24 dev eth1 table 10 ip route add default via 192.168.1.254 table 10 ip route show table 10 192.168.1.0/24 dev eth1 scope link default via 192.168.1.254 dev eth1 7.删除路由 可以使用ip命令来方便地删除路由,我们使用以下示例来说明如何删除路由。首先将路由表10的内容显示出来.,可以看到路由表10中当前有两条路由,接着使用ip route del命令删除默认路由.,在此别忘了指定我们所要删除的是路由表10,否则默认会删除路由表main的默认路由,接着再使用ip route show 命令查看路由表10.,
此时路由表10的默认路由已经不存在了,再次使用ip route del命令删除192.168.122.0/24的路由.,最后可以看到路由表10中已经没有任何路由了。 ip route show table 10 192.168.1.0/24 dev virbr0 scope link default via 192.168.1.254 dev eth1 ip route del default table 10 ip route show table 10 192.168.1.0/24 dev virbr0 scope link ip route del 192.168.1.0/24 table 10 ip route show table 10

25 ethtool 是用于查询及设置网卡参数的命令。 # https://blog.csdn.net/evenness/article/details/7519061

ethtool ethx       //查询ethx网口基本设置,其中 x 是对应网卡的编号,如eth0、eth1等等
ethtool –h        //显示ethtool的命令帮助(help)
ethtool –i ethX    //查询ethX网口的相关信息
ethtool –d ethX    //查询ethX网口注册性信息
ethtool –r ethX    //重置ethX网口到自适应模式
ethtool –S ethX    //查询ethX网口收发包统计
ethtool –s ethX [speed 10|100|1000] [duplex half|full]  [autoneg on|off]        //设置网口速率10/100/1000M、设置网口半/全双工、设置网口是否自协商
ethtool -E eth0 magic 0x10798086 offset 0x10 value 0x1A  修改网卡EEPROM内容(0x1079 网卡device id , 0x8086网卡verdor id  )
ethtool -e eth0  : dump网卡EEPROM内容

26 /proc/net/dev分析网络包量,流量,错包,丢包

Inter-|   Receive                                                |  Transmit
 face |bytes    packets errs drop fifo frame compressed multicast|bytes    packets errs drop fifo colls carrier compressed
    lo: 14527500  121271    0    0    0     0          0         0 14527500  121271    0    0    0     0       0          0
  eth1: 346180949  498417    0    0    0     0          0      3433 52436844  309153    0    0    0     0       0          0
 tunl0:       0       0    0    0    0     0          0         0        0       0    0    0    0     0       0          0
  gre1: 8882420  107654    0    0    0     0          0         0  8856769  110354    0    0    0     0       0          0
  ifb0: 12542866  107657    0    3    0     0          0         0 12542656  107654    0    0    0     0       0          0
  ifb1:       0       0    0    0    0     0          0         0        0       0    0    0    0     0       0          0
最左边的表示接口的名字,Receive表示收包,Transmit表示发包;
bytes表示收发的字节数;
packets表示收发正确的包量;
errs表示收发错误的包量;
drop表示收发丢弃的包量;

27 top命令可以看到总体的系统运行状态和cpu的使用率 。

%us:表示用户空间程序的cpu使用率(没有通过nice调度)
%sy:表示系统空间的cpu使用率,主要是内核程序。
%ni:表示用户空间且通过nice调度过的程序的cpu使用率。
%id:空闲cpu
%wa:cpu运行时在等待io的时间
%hi:cpu处理硬中断的数量
%si:cpu处理软中断的数量
%st:被虚拟机偷走的cpu

28 tc 限速 https://cloud.tencent.com/developer/article/1409664

2.1 流量控制方式
    SHAPING(限制): 当流量被限制,它的传输速率就被控制在某个值以下。限制值可以大大小于有效带宽,这样可以平滑突发数据流量,使网络更为稳定。shaping(限制)只适用于向外的流量。
    SCHEDULING(调度): 通过调度数据包的传输,可以在带宽范围内,按优先级分配带宽。SCHEDULING(调度)也只适于向外的流量。
    POLICING(策略):SHAPING用于处理向外的流量,而POLICIING(策略)用于处理接收到的数据。
    DROPPING(丢弃): 如果流量超过某个设定的带宽,就丢弃数据包,不管是向内还是向外。
2.2 流量控制处理对象
    qdisc:排队规则
    class:(类别)
    filter:(过滤器)
2.2.1 qdisc(排队规则)
    CLASSLESS QDisc(不可分类QDisc)
        [p|b]fifo:使用最简单的qdisc,纯粹的先进先出。只有一个参数:limit,用来设置队列的长度,pfifo是以数据包的个数为单位;bfifo是以字节数为单位。
        pfifo_fast:在编译内核时,如果打开了高级路由器(Advanced Router)编译选项,pfifo_fast就是系统的标准QDISC。它的队列包括三个波段(band)。在每个波段里面,使用先进先出规则。而三个波段(band)的优先级也不相同,band 0的优先级最高,band 2的最低。如果band0里面有数据包,
系统就不会处理band 1里面的数据包,band 1和band 2之间也是一样。数据包是按照服务类型(Type of Service,TOS)被分配多三个波段(band)里面的。 red:red是Random Early Detection(随机早期探测)的简写。如果使用这种QDISC,当带宽的占用接近于规定的带宽时,系统会随机地丢弃一些数据包。它非常适合高带宽应用。 sfq:sfq是Stochastic Fairness Queueing的简写。它按照会话(session--对应于每个TCP连接或者UDP流)为流量进行排序,然后循环发送每个会话的数据包。 tbf:tbf是Token Bucket Filter的简写,适合于把流速降低到某个值 CLASSFUL QDISC(分类QDisc): CBQ: CBQ是Class Based Queueing(基于类别排队)的缩写。它实现了一个丰富的连接共享类别结构,既有限制(shaping)带宽的能力,也具有带宽优先级管理的能力。带宽限制是通过计算连接的空闲时间完成的。空闲时间的计算标准是数据包离队事件的频率和下层连接(数据链路层)的带宽。 HTB: HTB是Hierarchy Token Bucket的缩写。通过在实践基础上的改进,它实现了一个丰富的连接共享类别体系。使用HTB可以很容易地保证每个类别的带宽,它也允许特定的类可以突破带宽上限,占用别的类的带宽。HTB可以通过TBF(Token Bucket Filter)实现带宽限制,也能够划分类别的优先级。 PRIO: PRIO QDisc不能限制带宽,因为属于不同类别的数据包是顺序离队的。使用PRIO QDisc可以很容易对流量进行优先级管理,只有属于高优先级类别的数据包全部发送完毕,才会发送属于低优先级类别的数据包。为了方便管理,需要使用iptables或者ipchains处理数据包的服务类型(Type Of Service,ToS)。 2.4 命名规则 所有的QDisc、类和过滤器都有ID。ID可以手工设置,也可以有内核自动分配。ID由一个主序列号和一个从序列号组成,两个数字用一个冒号分开。 QDISC: 一个QDisc会被分配一个主序列号,叫做句柄(handle),然后把从序列号作为类的命名空间。句柄采用象10:一样的表达方式。习惯上,需要为有子类的QDisc显式地分配一个句柄。 class:在同一个QDisc里面的类分享这个QDisc的主序列号,但是每个类都有自己的从序列号,叫做类识别符(classid)。类识别符只与父QDisc有关,和父类无关。类的命名习惯和QDisc的相同。 filter:过滤器的ID有三部分,只有在对过滤器进行散列组织才会用到。详情请参考tc-filters手册页。 2.5 单位 带宽或流速单位: mbps:兆字节/s kbit:Kbit/s mbit:Mbit/s bps或者一个无单位数字:字节/s 数据数量单位: mb或者m:兆字节 mbit:兆bit kbit:千bit b或者一个无单位数字:字节数 三、tc命令参数解读 tc可以使用以下命令对QDisc、类和过滤器进行操作: add:在一个节点里加入一个QDisc、类或者过滤器。添加时,需要传递一个祖先作为参数,传递参数时既可以使用ID也可以直接传递设备的根。如果要建立一个QDisc或者过滤器,可以使用句柄(handle)来命名;如果要建立一个类,可以使用类识别符(classid)来命名。 remove:删除有某个句柄(handle)指定的QDisc,根QDisc(root)也可以删除。被删除QDisc上的所有子类以及附属于各个类的过滤器都会被自动删除。 change:以替代的方式修改某些条目。除了句柄(handle)和祖先不能修改以外,change命令的语法和add命令相同。换句话说,change命令不能一定节点的位置。 replace:对一个现有节点进行近于原子操作的删除/添加。如果节点不存在,这个命令就会建立节点。 link:只适用于DQisc,替代一个现有的节点。 四、应用 Linux流量控制主要分为建立队列、建立分类和建立过滤器三个方面。 4.1 步骤: 针对网络物理设备(如以太网卡eth0)绑定一个队列QDisc; 在该队列上建立分类class; 为每一分类建立一个基于路由的过滤器filter; 最后与过滤器相配合,建立特定的路由表。 4.2 名称解释 htb:个tbf队列 handle 1:0:为队列命名或指定某队列 命名为1:0 default 1:默认归类为1 parent 1:0:父队列1:0 classid 1:1:添加一个分类并命名为1:1 rate 10Mbi:带宽为10M 期望中的传输速率 ceil 10Mbit:ceil是一个类最大能得到的带宽值 burst 15k:突发传输15k 指定了最多可以有多少个令牌能够即刻使用 latency 50ms:大延迟50ms perturb 10:是多少秒后重新配置一次散列算法,默认为10秒 sfq:他可以防止一个段内的一个ip占用整个带宽 protocol ip:根据ip进行过滤 prio 1: 设置优先级 优先级值越小 越先处理 match ip sport 80 0xffff:源端口 match ip dport 80 0xffff:目的端口 flowid 1:10:建立路由映射分类1:10 match ip protocol 1 0xff:根据IP协议 1表示icmp ip协议号列表https://zh.wikipedia.org/wiki/IP%E5%8D%8F%E8%AE%AE%E5%8F%B7%E5%88%97%E8%A1%A8 match ip protocol 6 0xff:tcp match ip protocol 17 0xff:udp u32:过滤器 flowid 2:10:建立路由映射分类2:10 cbq:cbq队列 bandwidth 10Mbit:实际带宽为10 Mbit avpkt 1000:包的平均大小为1000字节 cell 8:包间隔发送单元的大小为8字节 mpu 64:最小传输包大小为64字节 maxburst 20:可接收冲突的发送最长包数目为20字节 allot 1514:最大传输单元加MAC头的大小为1514字节 weight 1Mbit:实际带宽的加权速率为1Mbit split 1:0:分类的分离点为1:0 bounded:不可借用未使用带宽 route:过滤器为基于路由表 Ingress:入口部分 Egress:出口部分 监视 tc qdisc ls dev eth0:显示队列的状况 tc class ls dev eth0:简单显示指定设备(这里为eth0)的分类状况 tc -s class ls dev eth0:详细显示指定设备(这里为eth0)的分类状况 tc -s filter ls dev eth0:显示过滤器的状况 ip route:显示现有路由的状况 wondershaper: 了解完tc工具后再来看一个简单实用的限速工具——wondershaper。这个单词看似很复杂,但是当你看过源码之后会发现,这只不过是将tc一些简单的功能封装成了一个shell脚本而已 yum install epel-release wondershaper -y wondershaper eth0 1024 10240 # 将上行带宽限制为1M,下行带宽限制为10M wondershaper clean clean # 清除原有规则 (两个参数可以是任何字符) wondershaper eth0 # 查看已有规则 (查看eth0的规则) 一般为3个参数,第一个参数为网卡名,第二个上行速度(出)限制,第三个参数为下行速度(入)限制

29 cat /etc/sysctl.conf https://blog.csdn.net/zxljsbk/article/details/89186161

kernel.sysrq=0:是否启用kernel.sysrq(在大多数服务已无法响应的情况下,还能通过按键组合来完成一系列预先定义的系统操作,1启用,0禁用;
kernel.core_uses_pid=1:可以控制core文件的文件名中是否添加pid作为扩展(文件内容为1,表示添加pid作为扩展名,生成的core文件格式为core.xxxx;为0则表示生成的core文件同一命名为core);
kernel.msgmnb=65536:限制一个队列的最大长度;
kernel.msgmax=65536:限制一条消息的最大长度;
kernel.shmmax=68719476736:最大共享内存段大小;
kernel.shmall=4294967296:可以使用的共享内存的总量;
kernel.shmmni=4096:整个系统共享内存段的最大数目;
kernel.sem=25032000100128:每个信号对象集的最大信号对象数;系统范围内最大信号对象数;每个信号对象支持的最大操数;系统范围内最大信号对象集数;
kernel.msgmni=256:决定了系统中同时运行的最大的消息队列的个数;
fs.file-max=65536:系统级打开最大文件句柄的数量;
net.ipv4.ip_forward=0:(0代表禁止进行IP转发;1代表可以进行IP转发);
net.ipv4.conf.default.rp_filter=1:控制系统是否开启对数据包源地址的校验;
net.ipv4.conf.default.accept_source_route=0:禁用icmp源路由选项;
net.ipv4.tcp_syncookies=1:表示开启SYNCookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭;
net.ipv4.conf.all.forwarding=0:0代表不转发源路由帧,若做NAT建议开启;
net.ipv4.ip_local_port_range=900065000:系统中的程序会选择这个范围内的端口来连接到目的端口(目的端口当然是用户指定的;
net.ipv4.tcp_fin_timeout=30:表示如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间,默认是60,降低这个值以提高系统性能;
net.ipv4.tcp_max_syn_backlog=8192:定义backlog队列容纳的最大半连接数,如果配置高可以设置的更高;
net.core.rmem_default=262144:套接字接收缓冲区大小的缺省值;
net.core.rmem_max=4194304:套接字接收缓冲区大小的最大值;
net.core.wmem_default=262144:套接字发送缓冲区大小的缺省值;
net.core.wmem_max=262144:套接字发送缓冲区大小的最大值;

30 linux查看CPU占用前10进程

ps aux | head -1; ps aux | sort -k3nr | head -n 10

31 CentOs查看内存使用前十的程序

ps aux | head -1; ps aux | sort -k4nr | head -n 10

32 ps返回标题的含义

* `pid`:进程 ID,唯一标识正在运行的进程。
* `ppid`:父进程 ID,唯一标识该进程的父进程。
* `pgid`:进程组 ID,唯一标识该进程所属的进程组。
* `uid`:用户 ID,唯一标识该进程的所有者。
* `gid`:组 ID,唯一标识该进程所属的组。
* `username`:进程所有者的用户名。
* `start`:进程启动时间,以 Unix 时间戳表示。
* `vsz`:虚拟内存大小,以字节为单位。
* `rss`:内存占用率,以字节为单位。
* `tty`:进程运行的终端。
* `state`:进程状态,如 "R"(运行中)、"S"(睡眠中)等。
* `ppid`:父进程 ID,唯一标识该进程的父进程。
* `c`:CPU 占用率,以百分比为单位。
* `pri`:进程优先级。
* `nice`:进程的 nice 值,用于控制进程调度时的优先级。
* `adj`:进程的 adj 值,用于控制进程调度时的优先级。
* `s`:进程运行状态,如 "S"(睡眠中)、"Z"(暂停中)等。
* `start`:进程启动时间,以 Unix 时间戳表示。
* `time`:进程累计运行时间,以 Unix 时间戳表示。
* `cmd`:进程的命令行参数。