Linux子网划分、系统进程监控

1、100.0.0.16/28 对应网段的网关地址、广播地址、可分配IP地址范围

根据IP地址100.0.0.16判断该IP为一个A类IP地址。
根据子网掩码28,得到主机位是4位,掩码为255.255.255.240
因此主机数量为2^4-2= 14台主机
以第四段为例计算,
其中子网个数为2^4=16个,其中4表示借用第四段4个主机位
其中合法子网为:0 16 32 48 64 ...240总共16个
而IP地址100.0.0.16 在子网16中,
该子网的网络地址为:100.0.0.16
广播地址:100.0.0.31
可分配IP地址范围是100.0.0.17-100.0.0.30这14个IP地址。
网关地址为可分配IP地址范围中的任意一个IP地址。

2、使用man手册学习tcpdump的使用

tcpdump 是一个运行在命令行下的抓包工具。它允许用户拦截和显示发送或收到过网络连接到该计算机的TCP/IP和其他数据包。tcpdump 适用于大多数的类Unix系统操作系统(如linux,BSD等)。

  • tcpdump采用命令行方式,它的命令格式为:
    Usage: tcpdump [-aAbdDefhHIJKlLnNOpqStuUvxX#] [ -B size ] [ -c count ]
    [ -C file_size ] [ -E algo:secret ] [ -F file ] [ -G seconds ]
    [ -i interface ] [ -j tstamptype ] [ -M secret ] [ --number ]
    [ -Q|-P in|out|inout ]
    [ -r file ] [ -s snaplen ] [ --time-stamp-precision precision ]
    [ --immediate-mode ] [ -T type ] [ --version ] [ -V file ]
    [ -w file ] [ -W filecount ] [ -y datalinktype ] [ -z postrotate-command ]
    [ -Z user ] [ expression ]
  • 命令选项说明
    -a #将网络地址和广播地址转变成名字
    -A #以ASCII格式打印出所有分组,并将链路层的头最小化
    -b #数据链路层上选择协议,包括ip/arp/rarp/ipx都在这一层
    -c #指定收取数据包的次数,即在收到指定数量的数据包后退出tcpdump
    -d #将匹配信息包的代码以人们能够理解的汇编格式输出
    -dd #将匹配信息包的代码以c语言程序段的格式输出
    -ddd #将匹配信息包的代码以十进制的形式输出
    -D #打印系统中所有可以监控的网络接口
    -e #在输出行打印出数据链路层的头部信息
    -f #将外部的Internet地址以数字的形式打印出来,即不显示主机名
    -F #从指定的文件中读取表达式,忽略其他的表达式
    -i #指定监听网络接口
    -l #使标准输出变为缓冲形式,可以数据导出到文件
    -L #列出网络接口已知的数据链路
    -n #不把网络地址转换为名字
    -N 不输出主机名中的域名部分,例如www.baidu.com只输出www
    -nn #不进行端口名称的转换
    -P #不将网络接口设置为混杂模式
    -q #快速输出,即只输出较少的协议信息
    -r #从指定的文件中读取数据,一般是-w保存的文件
    -w #将捕获到的信息保存到文件中,且不分析和打印在屏幕
    -s #从每个组中读取在开始的snaplen个字节,而不是默认的68个字节
    -S #将tcp的序列号以绝对值形式输出,而不是相对值
    -T #将监听到的包直接解析为指定的类型的报文,常见的类型有rpc(远程过程调用)和snmp(简单网络管理协议)
    -t #在输出的每一行不打印时间戳
    -tt #在每一行中输出非格式化的时间戳
    -ttt #输出本行和前面以后之间的时间差
    -tttt #在每一行中输出data处理的默认格式的时间戳
    -u #输出未解码的NFS句柄
    -v #输出稍微详细的信息,例如在ip包中可以包括ttl和服务类型的信息
    -vv#输出相信的报文信息
  • tcpdump的表达式:
    表达式是一个正则表达式,tcpdump利用它作为过滤报文的条件,如果一个报文满足表达式的条件,则这个报文将会被捕获。如果没有给出任何条件,则网络上所有的信息包 将会被截获,在表达式中一般如下几种类型的关键字:
    • 关于数据类型的关键字:
      包括host、port、net,例如host 192.168.1.1表示这是一台主机,net 192.168.0.0表示这是一个网络地址,port 22指明端口号是22,如果没有指明类型,则默认的类型是host。
    • 数据传输方向的关键字:
      包括src、dst、dst or src、dst and src,这些关键字指明了传输的方向,比如src 192.168.1.1说明数据包源地址是192.168.1.1,dst net 192.168.0.0指明目的网络地址是192.168.0.0,默认是监控主机对主机的src和dst,即默认监听本机和目标主机的所有数据。
    • 协议关键字:
      包括ip、arp、rarp、tcp、udp等,
    • 其他关键字:
      运算类型的:or、and、not、!
      辅助功能型的:gateway、less、broadcast、greater
  • tcpdump常用示例
 下面所有测试中都有 -i any的选项,表示抓取所有网络接口上的包,只是为了让测试方便
  
  //抓取arp协议的包,然后host为10.192.2.*  测试时需要在另一个session,做一个ifconfig指令
  //arp可以换为tcp,udp等
[root@node01 ~]#tcpdump -i any -n arp host 10.192.2.222 
15:36:51.821905 ARP, Request who-has 10.192.2.1 tell 10.192.2.222, length 28
15:36:51.822449 ARP, Reply 10.192.2.1 is-at 38:97:d6:f8:bd:33, length 46

  //抓取访问destination 80端口的包,然后我们做一个curl www.baidu.com的操作
[root@node01 ~]# tcpdump -i any -n dst port 80 
15:39:01.369435 IP 10.192.2.222.47686 > 14.215.177.38.http: Flags [S], seq 819318323, win 29200, options [mss 1460,sackOK,TS val 2850464827 ecr 0,nop,wscale 7], length 0
15:39:01.376363 IP 10.192.2.222.47686 > 14.215.177.38.http: Flags [.], ack 1490870282, win 229, length 0
15:39:01.376479 IP 10.192.2.222.47686 > 14.215.177.38.http: Flags [P.], seq 0:77, ack 1, win 229, length 77: HTTP: GET / HTTP/1.1
15:39:01.386582 IP 10.192.2.222.47686 > 14.215.177.38.http: Flags [.], ack 1849, win 257, length 0
15:39:01.386637 IP 10.192.2.222.47686 > 14.215.177.38.http: Flags [.], ack 2782, win 277, length 0
15:39:01.386884 IP 10.192.2.222.47686 > 14.215.177.38.http: Flags [F.], seq 77, ack 2782, win 277, length 0
15:39:01.393760 IP 10.192.2.222.47686 > 14.215.177.38.http: Flags [.], ack 2783, win 277, length 0

  //抓取源上端口是22的包
[root@node01 ~]# tcpdump -i any -n src port 22  
15:42:01.250919 IP 10.192.2.222.ssh > 10.192.52.63.54158: Flags [P.], seq 2151794643:2151794839, ack 2324872893, win 291, length 196
15:42:01.251262 IP 10.192.2.222.ssh > 10.192.52.63.54158: Flags [P.], seq 196:376, ack 1, win 291, length 180
15:42:01.251447 IP 10.192.2.222.ssh > 10.192.52.63.54158: Flags [P.], seq 376:540, ack 1, win 291, length 164


  //抓取源或者目标端口都是22的包
[root@node01 ~]# tcpdump -i any -n port 22 -c   
15:42:55.031581 IP 10.192.2.222.ssh > 10.192.52.63.54158: Flags [P.], seq 2151796671:2151796867, ack 2324874073, win 291, length 196
15:42:55.031937 IP 10.192.2.222.ssh > 10.192.52.63.54158: Flags [P.], seq 196:376, ack 1, win 291, length 180
15:42:55.032124 IP 10.192.2.222.ssh > 10.192.52.63.54158: Flags [P.], seq 376:540, ack 1, win 291, length 164



  //表示抓取destination prot 在1到80之间的端口的数据,在另外的面做curl www.baidu.com 
[root@node01 ~]# tcpdump -i any -n dst portrange 1-80  
15:44:45.205605 IP 10.192.52.63.54158 > 10.192.2.222.ssh: Flags [P.], seq 0:52, ack 1629, win 253, length 52
15:44:45.216919 IP 10.192.2.222.59407 > 114.114.114.114.domain: 63614+ A? www.baidu.com. (31)
15:44:45.216943 IP 10.192.2.222.59407 > 114.114.114.114.domain: 39132+ AAAA? www.baidu.com. (31)
15:44:45.218231 IP 10.192.52.63.54158 > 10.192.2.222.ssh: Flags [.], ack 2073, win 252, length 0
15:44:45.244046 IP 10.192.2.222.47688 > 14.215.177.38.http: Flags [S], seq 36781375, win 29200, options [mss 1460,sackOK,TS val 2850808702 ecr 0,nop,wscale 7], length 0
15:44:45.245393 IP 10.192.52.63.54158 > 10.192.2.222.ssh: Flags [.], ack 2433, win 256, length 0
15:44:45.249647 IP 10.192.2.222.47688 > 14.215.177.38.http: Flags [.], ack 4195151903, win 229, length 0
15:44:45.249916 IP 10.192.2.222.47688 > 14.215.177.38.http: Flags [P.], seq 0:77, ack 1, win 229, length 77: HTTP: GET / HTTP/1.1
15:44:45.250800 IP 10.192.52.63.54158 > 10.192.2.222.ssh: Flags [.], ack 2729, win 255, length 0
15:44:45.252378 IP 10.192.52.63.54158 > 10.192.2.222.ssh: Flags [.], ack 3057, win 254, length 0
15:44:45.256963 IP 10.192.2.222.47688 > 14.215.177.38.http: Flags [.], ack 1449, win 251, length 0
15:44:45.257038 IP 10.192.2.222.47688 > 14.215.177.38.http: Flags [.], ack 2782, win 272, length 0
15:44:45.257363 IP 10.192.2.222.47688 > 14.215.177.38.http: Flags [F.], seq 77, ack 2782, win 272, length 0


  //抓取源的端口是20-80的包
[root@node01 ~]# tcpdump -i any -n src portrange 20-80 
15:48:25.510628 IP 10.192.2.222.ssh > 10.192.52.63.54158: Flags [P.], seq 2152992151:2152992347, ack 2324881429, win 291, length 196
15:48:25.510960 IP 10.192.2.222.ssh > 10.192.52.63.54158: Flags [P.], seq 196:376, ack 1, win 291, length 180
15:48:25.511157 IP 10.192.2.222.ssh > 10.192.52.63.54158: Flags [P.], seq 376:540, ack 1, win 291, length 164


   
  //抓取destination为www.baidu.com的包
 [root@node01 ~]# tcpdump -i any dst www.baidu.com

15:50:06.569979 IP node01 > 14.215.177.39: ICMP echo request, id 5139, seq 16, length 64
15:50:07.571298 IP node01 > 14.215.177.39: ICMP echo request, id 5139, seq 17, length 64


  //抓取destination为10.192.2.161的包
[root@node01 ~]# tcpdump -i any dst 10.192.2.161
15:52:02.265951 ARP, Request who-has 10.192.2.161 tell gateway, length 46
15:53:02.311727 ARP, Request who-has 10.192.2.161 tell gateway, length 46


  //抓取包长度小于800的包
 [root@node01 ~]# tcpdump -i any -n less 800
15:56:02.297070 IP 10.192.2.222.ssh > 10.192.52.63.54158: Flags [P.], seq 196:376, ack 1, win 291, length 180
15:56:02.297252 IP 10.192.2.222.ssh > 10.192.52.63.54158: Flags [P.], seq 376:540, ack 1, win 291, length 164


  //抓取包长度大于800的包
[root@node01 ~]# tcpdump -i any -n greater  800
5:57:52.926274 IP 14.215.177.38.http > 10.192.2.222.47690: Flags [P.], seq 727058018:727059866, ack 3414192055, win 776, length 1848: HTTP: HTTP/1.1 200 OK
15:57:52.926352 IP 14.215.177.38.http > 10.192.2.222.47690: Flags [P.], seq 1848:2781, ack 1, win 776, length 933: HTTP
15:57:52.928952 IP 10.192.2.222.ssh > 10.192.52.63.54158: Flags [P.], seq 2153586163:2153588631, ack 2324893229, win 291, length 2468


  //只抓取tcp包
[root@node01 ~]# tcpdump -i any -n tcp
15:58:59.096035 IP 10.192.2.222.ssh > 10.192.52.63.54158: Flags [P.], seq 196:376, ack 1, win 291, length 180
15:58:59.096253 IP 10.192.2.222.ssh > 10.192.52.63.54158: Flags [P.], seq 376:540, ack 1, win 291, length 164

  //只抓取udp包
[root@node01 ~]# tcpdump -i any -n udp 
15:59:54.956283 IP 10.192.2.126.netbios-dgm > 10.192.2.255.netbios-dgm: NBT UDP PACKET(138)

  //只抓取icmp的包,ping命令
  [root@node01 ~]# tcpdump -i any -n icmp
16:00:40.899281 IP 10.192.2.222 > 14.215.177.38: ICMP echo request, id 5160, seq 1, length 64
16:00:40.905691 IP 14.215.177.38 > 10.192.2.222: ICMP echo reply, id 5160, seq 1, length 64
16:00:41.900451 IP 10.192.2.222 > 14.215.177.38: ICMP echo request, id 5160, seq 2, length 64

3、详细叙述僵尸进程产生的原因以及危害

  • 僵尸进程简介
    在linux系统中,当用ps命令观察进程的执行状态时,经常看到某些进程的状态栏为defunct,这就是所谓的“僵尸”进程。“僵尸”进程是一个早已死亡的进程,但在进程表(processs table)中仍占了一个位置(slot)。由于进程表的容量是有限的,所以,defunct进程不仅占用系统的内存资源,影响系统的性能,而且如果其数目太多,还会导致系统瘫痪。
  • 僵尸进程的产生原因
    我们知道,每个进程在进程表里都有一个进入点(entry),核心程序执行该进程时使用到的一切信息都存储在进入点。当用ps命令察看系统中的进程信息时,看到的就是进程表中的相关数据。所以,当一个父进程以fork()系统调用建立一个新的子进程后,核心进程就会在进程表中给这个子进程分配一个进入点,然后将相关信息存储在该进入点所对应的进程表内。这些信息中有一项是其父进程的识别码。而当这个子进程结束的时候(比如调用exit命令结束),其实他并没有真正的被销毁,而是留下一个称为僵尸进程(Zombie)的数据结构(系统调用exit的作用是使进程退出,但是也仅仅限于一个正常的进程变成了一个僵尸进程,并不能完全将其销毁)。此时原来进程表中的数据会被该进程的退出码(exit code)、执行时所用的CPU时间等数据所取代,这些数据会一直保留到系统将它传递给它的父进程为止。由此可见,defunct进程的出现时间是在子进程终止后,但是父进程尚未读取这些数据之前。此时,该僵尸子进程已经放弃了几乎所有的内存空间,没有任何可执行代码,也不能被调度,仅仅在进程列表中保留一个位置,记载该进程的退出状态信息供其他进程收集,除此之外,僵尸进程不再占有任何存储空间。他需要他的父进程来为他收尸,如果他的父进程没有安装SIGCHLD信号处理函数调用wait 或 waitpid() 等待子进程结束,也没有显式忽略该信号,那么它就一直保持僵尸状态,如果这时候父进程结束了,那么init进程会自动接手这个子进程,为他收尸,他还是能被清除掉的。但是如果父进程是一个循环,不会结束,那么子进程就会一直保持僵尸状态,这就是系统中为什么有时候会有很多的僵尸进程。
  • 如何杀死僵尸进程
    • 重启服务器电脑,这个是最简单,最易用的方法,但是如果你服务器电脑上运行有其他的程序,那么这个方法,代价很大。
    • 找到该defunct僵尸进程的父进程,将该进程的父进程杀掉,则此defunct进程将自动消失
      命令: ps -ef | grep defunct_process_pid
  • 如何预防僵尸进程
    • 在父进程创建子进程之前,就向系统申明自己并不会对这个子进程的exit动作进行任何关注行为,这样的话,子进程一旦退出后,系统就不会去等待父进程的操作,而是直接将该子进程的资源回收掉,也就不会出现僵尸进程了。具体的办法就是,在父进程的初始化函数中,调用这个函数:signal(SIGCHLD,SIG_IGN);
    • 如果上述语句没来得及调用,也有另外一个办法。那就是在创建完子进程后,用waitpid等待子进程返回,也能达到上述效果;
    • 如果上述两个办法都不愿意采用,那还有一招:在父进程创建子进程的时候,连续调用两次fork(),而且使紧跟的子进程直接退出,使其孙子进程成为孤儿进程,从而init进程将代替父进程来接手,负责清除这个孤儿进程。于是,父进程就无需进行任何的清理行为,系统会自动处理;

4、详细说明vmstat输出结果的含义

vmstat命令: 用来获得有关进程、虚存、页面交换空间及 CPU活动的信息。这些信息反映了系统的负载情况。

  • 虚拟内存运行原理
    在系统中运行的每个进程都需要使用到内存,但不是每个进程都需要每时每刻使用系统分配的内存空间。当系统运行所需内存超过实际的物理内存,内核会释放某些进程所占用但未使用的部分或所有物理内存,将这部分资料存储在磁盘上直到进程下一次调用,并将释放出的内存提供给有需要的进程使用。在Linux内存管理中,主要是通过“调页Paging”和“交换Swapping”来完成上述的内存调度。调页算法是将内存中最近不常使用的页面换到磁盘上,把活动页面保留在内存中供进程使用。交换技术是将整个进程,而不是部分页面,全部交换到磁盘上。分页(Page)写入磁盘的过程被称作Page-Out,分页(Page)从磁盘重新回到内存的过程被称作Page-In。当内核需要一个分页时,但发现此分页不在物理内存中(因为已经被Page-Out了),此时就发生了分页错误(Page Fault)。当系统内核发现可运行内存变少时,就会通过Page-Out来释放一部分物理内存。经管Page-Out不是经常发生,但是如果Page-out频繁不断的发生,直到当内核管理分页的时间超过运行程式的时间时,系统效能会急剧下降。这时的系统已经运行非常慢或进入暂停状态,这种状态亦被称作thrashing(颠簸)。
  • vmstat常用用法组合
    vmstat [options] [delay [count]]
    vmstat [-a] [-n] [-S unit] [delay [ count]]
    vmstat [-s] [-n] [-S unit]
    vmstat [-m] [-n] [delay [ count]]
    vmstat [-d] [-n] [delay [ count]]
    vmstat [-p disk partition] [-n] [delay [ count]]
    vmstat [-f]
    vmstat [-V]
  • 选项说明
    -a:显示活跃和非活跃内存
    -f:显示从系统启动至今的fork数量 。
    -m:显示slabinfo
    -n:只在开始时显示一次各字段名称。
    -s:显示内存相关统计信息及多种系统活动数量。
    delay:刷新时间间隔。如果不指定,只显示一条结果。
    count:刷新次数。如果不指定刷新次数,但指定了刷新时间间隔,这时刷新次数为无穷。
    -d:显示磁盘相关统计信息。
    -p:显示指定磁盘分区统计信息
    -S:使用指定单位显示。参数有 k 、K 、m 、M ,分别代表1000、1024、1000000、1048576字节(byte)。默认单位为K(1024 bytes)
    -V:显示vmstat版本信息。
  • 根据示例进行字段说明
[root@node01 ~]# 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
 1  0      0 1135388   6332 2578060    0    0     0     1    4    5  0  0 100  0  0
 0  0      0 1135372   6332 2578060    0    0     0     0   98   81  0  0 100  0  0
 0  0      0 1135372   6332 2578060    0    0     0     0   86   72  0  0 100  0  0
 0  0      0 1135372   6332 2578060    0    0     0     0   92   74  0  0 100  0  0
 0  0      0 1135372   6332 2578060    0    0     0     0   83   72  0  0 100  0  0
  • procs
    r 等待执行的任务数 说明:展示了正在执行和等待cpu资源的任务个数。当这个值超过了cpu个数,就会出现cpu瓶颈
    b 等待IO的进程数量
  • memory
    swpd 正在使用虚拟的内存大小,单位k
    free 空闲内存大小
    buff 已用的buff大小,对块设备的读写进行缓冲
    cache 已用的cache大小,文件系统的cache
    inact 非活跃内存大小,即被标明可回收的内存,区别于free和active
    active 活跃的内存大小
  • swap
    si 每秒从交换区写入内存的大小(单位:kb/s)
    so 每秒从内存写到交换区的大小
  • io
    bi 每秒读取的块数(读磁盘)
    bo 每秒写入的块数(写磁盘)
  • system
    in 每秒中断数,包括时钟中断
    cs 每秒上下文切换数
  • cpu
    us 用户进程执行消耗cpu时间(user time)
    sy 系统进程消耗cpu时间(system time)
    id 空闲时间(包括IO等待时间)
    wa 等待IO时间
    st 从虚拟机窃取的时间
  • 常见问题处理
    • 如果r经常大于4,且id经常少于40,表示cpu的负荷很重。

    • 如果si,so长期不等于0,表示内存不足。

    • 如果wa经常不等于0,且在b中的队列大于3,表示io性能不好。

    • 如果在processes中运行的序列(process r)是连续的大于在系统中的CPU的个数表示系统现在运行比较慢,有多数的进程等待CPU。

    • 如果r的输出数大于系统中可用CPU个数的4倍的话,则系统面临着CPU短缺的问题,或者是CPU的速率过低,系统中有多数的进程在等待CPU,造成系统中进程运行过慢。

    • 如果空闲时间(cpu id)持续为0并且系统时间(cpu sy)是用户时间的两倍(cpu us)系统则面临着CPU资源的短缺。
      解决办法:
      当发生以上问题的时候请先调整应用程序对CPU的占用情况.使得应用程序能够更有效的使用CPU.同时可以考虑增加更多的CPU. 关于CPU的使用情况还可以结合mpstat, ps aux top prstat –a等等一些相应的命令来综合考虑关于具体的CPU的使用情况,和那些进程在占用大量的CPU时间.一般情况下,应用程序的问题会比较大一些.比如一些sql语句不合理等等都会造成这样的现象.

    • 内存问题现象:
      内存的瓶颈是由scan rate (sr)来决定的.scan rate是通过每秒的始终算法来进行页扫描的.如果scan rate(sr)连续的大于每秒200页则表示可能存在内存缺陷.同样的如果page项中的pi和po这两栏表示每秒页面的调入的页数和每秒调出的页数.如果该值经常为非零值,也有可能存在内存的瓶颈,当然,如果个别的时候不为0的话,属于正常的页面调度这个是虚拟内存的主要原理.
      解决办法:
      1.调节applications & servers使得对内存和cache的使用更加有效.
      2.增加系统的内存.
      关于内存的使用情况还可以结ps aux top prstat –a等等一些相应的命令来综合考虑关于具体的内存的使用情况,和那些进程在占用大量的内存.一般情况下,如果内存的占用率比较高,但是,CPU的占用很低的时候,可以考虑是有很多的应用程序占用了内存没有释放,但是,并没有占用CPU时间,可以考虑应用程序,对于未占用CPU时间和一些后台的程序,释放内存的占用。

你可能感兴趣的:(Linux子网划分、系统进程监控)