精华内容
下载资源
问答
  • Linux系统时间同步方法小结

    万次阅读 多人点赞 2019-01-20 12:19:17
    在Windwos中,系统时间的设置很简单,界面操作,通俗易懂,而且设置后,重启,关机都没关系。系统时间会自动保存在BIOS时钟...但在Linux下,默认情况下,系统时间和硬件时间并会自动同步。在Linux运行过程中,系...

    本文转载自https://www.cnblogs.com/ibnode/p/3573302.html

    在Windwos中,系统时间的设置很简单,界面操作,通俗易懂,而且设置后,重启,关机都没关系。系统时间会自动保存在BIOS时钟里面,启动计算机的时候,系统会自动在BIOS里面取硬件时间,以保证时间的不间断。但在Linux下,默认情况下,系统时间和硬件时间并不会自动同步。在Linux运行过程中,系统时间和硬件时间以异步的方式运行,互不干扰。硬件时间的运行,是靠BIOS电池来维持,而系统时间,是用CPU Tick来维持的。在系统开机的时候,会自动从BIOS中取得硬件时间,设置为系统时间。

    1. Linux系统时间的设置

    在Linux中设置系统时间,可以用date命令:

    //查看时间
    [root@node1 ~]# date
    Tue Feb 25 20:15:18 CST 2014
    //修改时间
    [root@node1 ~]# date -s "20140225 20:16:00"  #yyyymmdd hh:mm:ss
    Tue Feb 25 20:16:00 CST 2014
    //date 有多种时间格式可接受,查看date --help
    

    2. Linux硬件时间的设置

    硬件时间的设置,可以用hwclock或者clock命令。两者基本相同,只用一个就行,只不过clock命令除了支持x86硬件体系外,还支持Alpha硬件体系。

    //查看硬件时间可以是用hwclock ,hwclock --show 或者 hwclock -r
    [root@node1 ~]# hwclock --show
    Tue 25 Feb 2014 08:21:14 PM CST -0.327068 seconds
    //设置硬件时间
    [root@node1 ~]# hwclock --set --date "20140225 20:23:00"
    [root@node1 ~]# hwclock
    Tue 25 Feb 2014 08:23:04 PM CST -0.750440 seconds
    

    3. 系统时间和硬件时间的同步

    同步系统时间和硬件时间,可以使用hwclock命令。

    //以系统时间为基准,修改硬件时间
    [root@node1 ~]# hwclock --systohc <== sys(系统时间)to(写到)hc(Hard Clock)
    //或者
    [root@node1 ~]# hwclock -w
    //以硬件时间为基准,修改系统时间
    [root@node1 ~]# hwclock --hctosys
    //或者
    [root@node1 ~]# hwclock -s
    

    4. 不同机器之间的时间同步

    为了避免主机时间因为长期运行下所导致的时间偏差,进行时间同步(synchronize)的工作是非常必要的。Linux系统下,一般使用ntp服务器来同步不同机器的时间。一台机器,可以同时是ntp服务端和ntp客户端。在生产系统中,推荐使用像DNS服务器一样分层的时间服务器来同步时间。

    不同机器间同步时间,可以使用ntpdate命令,也可以使用ntpd服务。

    4.1 ntpdate命令

    使用ntpdate比较简单。格式如下:

    1 [root@node1 ~]# ntpdate [NTP IP/hostname]
    2 [root@node1 ~]# ntpdate 192.168.0.1
    3 [root@node1 ~]# ntpdate time.ntp.org
    

    但这样的同步,只是强制性的将系统时间设置为ntp服务器时间。如果CPU Tick有问题,只是治标不治本。所以,一般配合cron命令,来进行定期同步设置。比如,在crontab中添加:

    0 12 * * * /usr/sbin/ntpdate 192.168.0.1
    

    这样,会在每天的12点整,同步一次时间。ntp服务器为192.168.0.1。

    或者将下列脚本添加到/etc/cron.hourly/,这样就每小时会执行一次同步:

    #!/bin/bash
    #
    # $Id: sync-clock,v 1.6 2009/12/23 15:41:29 jmates Exp $
    #
    # Use ntpdate to get rough clock sync with department of Genome Sciences
    # time server.
    
    NTPDATE=/usr/sbin/ntpdate
    SERVER="192.168.0.1 "
    
    # if running from cron (no tty available), sleep a bit to space
    # out update requests to avoid slamming a server at a particular time
    if ! test -t 0; then
      MYRAND=$RANDOM
      MYRAND=${MYRAND:=$$}
    
      if [ $MYRAND -gt 9 ]; then
        sleep `echo $MYRAND | sed 's/.*\(..\)$/\1/' | sed 's/^0//'`
      fi
    fi
    
    $NTPDATE -su $SERVER
    # update hardware clock on Linux (RedHat?) systems
    if [ -f /sbin/hwclock ]; then
      /sbin/hwclock --systohc
    fi
    

    4.2 ntpd服务

    使用ntpd服务,要好于ntpdate加cron的组合。因为,ntpdate同步时间会造成时间的突变和跳跃,对一些依赖时间的程序和服务会造成影响。比如sleep,timer等。而且ntpd服务可以在修正时间的同时,修正CPU Tick。因此理想的做法为,在开机的时候,使用ntpdate强制同步时间,在其他时候使用ntpd服务来同步时间。

    要注意的是,ntpd 有一个自我保护的机制:如果本机与上源时间相差太大,ntpd 不会运行时间同步操作,所以新设置的时间服务器一定要先 ntpdate 从上源取得时间初值, 然后启动 ntpd服务。ntpd服务运行后,先是每64秒与上源NTP服务器同步一次,根据每次同步时测得的误差值经复杂计算逐步调整自己的时间,随着误差减小,逐步增加同步的间隔。每次跳动,都会重复这个调整的过程。

    4.3. ntpd服务的设置

    ntpd服务的相关设置文件如下:

    (1)/etc/ntp.conf:这个是NTP daemon的主要设文件,也是 NTP 唯一的设定文件。

    (2)/usr /share/zoneinfo/:在这个目录下的文件其实是规定了各主要时区的时间设定文件,例如北京地区的时区设定文件在 /usr/share/zoneinfo/Asia/Shanghai 就是了。这个目录里面的文件与底下要谈的两个文件(clock 与localtime)是有关系的。

    (3)/etc/sysconfig/clock:这个文件其实也不包含在NTP 的 daemon 当中,因为这个是 Linux 的主要时区设定文件。每次开机后,Linux 会自动的读取这个文件来设定自己系统所默认要显示的时间。

    (4)/etc /localtime:这个文件就是"本地端的时间配置文件"。刚刚那个clock 文件里面规定了使用的时间设置文件(ZONE) 为 /usr/share/zoneinfo/Asia/Shanghai ,所以说,这就是本地端的时间了,此时, Linux系统就会将Shanghai那个文件另存为一份 /etc/localtime文件,所以未来我们的时间显示就会以Beijing那个时间设定文件为准。

    下面重点介绍 /etc/ntp.conf文件的设置。在 NTP Server 的设定上,建议不要对Internet 无限制的开放,尽量仅提供局域网内部的 Client 端联机进行网络校时。此外,NTP Server 总也是需要网络上面较为准确的主机来自行更新自己的时间啊,所以在我们的 NTP Server 上面也要找一部最靠近自己的 Time Server 来进行自我校正。事实上, NTP 这个服务也是 Server/Client 的一种模式。

    [root@linux ~]# vi /etc/ntp.conf 
    # 1. 关于权限设定部分 
    #  权限的设定主要以 restrict 这个参数来设定,主要的语法为: 
    #   restrict IP mask netmask_IP parameter 
    #   其中 IP 可以是软件地址,也可以是 default ,default 就类似 0.0.0.0 
    #  至于 paramter 则有: 
    #   ignore :关闭所有的 NTP 联机服务 
    #   nomodify:表示 Client 端不能更改 Server 端的时间参数,不过Client 端仍然可以透过 Server 端来进行网络校时。
    
    #   notrust :该 Client 除非通过认证,否则该 Client 来源将被视为不信任网域 
    #   noquery :不提供 Client 端的时间查询
    
    #   notrap :不提供trap这个远程事件登入
    
    #  如果 paramter 完全没有设定,那就表示该 IP (或网域)"没有任何限制"
    
    restrict default nomodify notrap noquery # 关闭所有的 NTP 要求封包
    
    restrict 127.0.0.1    #这是允许本机查询
    
    restrict 192.168.0.1 mask 255.255.255.0 nomodify
    
    #在192.168.0.1/24网段内的服务器就可以通过这台NTP Server进行时间同步了 
    # 2. 上层主机的设定 
    #  要设定上层主机主要以 server 这个参数来设定,语法为:
    #  server [IP|HOST Name] [prefer]
    #  Server 后面接的就是上层 Time Server,而如果 Server 参数
    
    # 后面加上 perfer 的话,那表示我们的 NTP 主机主要以该部主机来
    
    # 作为时间校正的对应。另外,为了解决更新时间封包的传送延迟动作,
    
    #  所以可以使用 driftfile 来规定我们的主机 
    #  在与 Time Server 沟通时所花费的时间,可以记录在 driftfile  
    #  后面接的文件内,例如下面的范例中,我们的 NTP server 与  
    #  cn.pool.ntp.org联机时所花费的时间会记录在 /etc/ntp/drift文件内 
    server 0.pool.ntp.org
    
    server 1.pool.ntp.org
    
    server 2.pool.ntp.org
    
    server cn.pool.ntp.org prefer
    
    #其他设置值,以系统默认值即可
    
    server  127.127.1.0     # local clock
    
    fudge   127.127.1.0 stratum 10
    
    driftfile /var/lib/ntp/drift
    broadcastdelay  0.008
    
    keys /etc/ntp/keys
    

    总结一下,restrict用来设置访问权限,server用来设置上层时间服务器,driftfile用来设置保存漂移时间的文件。

    4.4 ntpd服务的启动与查询

    在启动NTP服务前,先对提供服务的这台主机手动的校正一次时间(因为启动服务器,端口会被服务端占用,就不能手动同步时间了)。

    [root@node1 ~]# ntpdate cn.pool.ntp.org
    25 Feb 21:10:52 ntpdate[9549]: adjust time server 202.112.31.197 offset 0.000101 sec
    

    然后,启动ntpd服务:

    [root@node1 ~]# /etc/init.d/ntpd start
    Starting ntpd: [ OK ]
    [root@node1 ~]# date
    Tue Feb 25 21:11:07 CST 2014
    

    查看端口(ntpd服务使用UDP的123端口):

    [root@node1 ~]# netstat -ln |grep :123
    udp 0 0 12.12.12.100:123 0.0.0.0:*
    udp 0 0 192.168.0.100:123 0.0.0.0:*
    udp 0 0 172.18.226.174:123 0.0.0.0:*
    udp 0 0 10.10.10.100:123 0.0.0.0:*
    udp 0 0 127.0.0.1:123 0.0.0.0:*
    udp 0 0 0.0.0.0:123 0.0.0.0:*
    udp 0 0 fe80::225:90ff:fe98:61ff:123 :::*
    udp 0 0 fe80::225:90ff:fe98:61fe:123 :::*
    udp 0 0 fe80::202:c903:1b:afa1:123 :::*
    udp 0 0 ::1:123 :::*
    udp 0 0 :::123 :::*
    

    如何确认我们的NTP服务器已经更新了自己的时间呢?

    [root@node1 ~]# ntpstat
    synchronised to NTP server (202.120.2.101) at stratum 4
    time correct to within 557 ms
    polling server every 64 s
    # 该指令可列出NTP服务器是否与上层联机。由上述输出结果可知,时间校正约
    # 为557*10(-6)秒,且每隔64秒会主动更新时间。
    

    常见的错误:

    unsynchronized time server re-starting polling server every 64 s
    // 或者
    25 Apr 15:30:17 ntpdate[11520]: no server suitable for synchronization found
    

    其实,这不是一个错误。而是由于每次重启NTP服务器之后大约要3-5分钟客户端才能与server建立正常的通讯连接。当此时用客户端连接服务端就会报这样的信息。一般等待几分钟就可以了。

    [root@node1 ~] # ntptrace –n
    127.0.0.1:stratum 11, offset 0.000000,synch distance 0.950951
    222.73.214.125:stratum 2,offset –0.000787,synch distance 0.108575
    209.81.9.7:stratum 1,offset 0.000028,synch distance 0.00436,refid 'GPS'
    # 这个指令可以列出目前NTP服务器(第一层)与上层NTP服务器(第二层)
    # 彼此之间的关系,注意:该命令需要安装ntp-perl包
    

    ntpq命令:

    [root@node1 ~]# ntpq -p
    

    在这里插入图片描述

    指令"ntpq -p"可以列出目前我们的NTP与相关的上层NTP的状态,以上的几个字段的意义如下:

    remote:即NTP主机的IP或主机名称。注意最左边的符号,如果由"+“则代表目前正在作用钟的上层NTP,如果是”*"则表示也有连上线,不过是作为次要联机的NTP主机。

    refid:参考的上一层NTP主机的地址
    st:即stratum阶层
    when:几秒前曾做过时间同步更新的操作
    poll:下次更新在几秒之后
    reach:已经向上层NTP服务器要求更新的次数
    delay:网络传输过程钟延迟的时间
    offset:时间补偿的结果
    jitter:Linux系统时间与BIOS硬件时间的差异时间

    最后提及一点,ntp服务默认只会同步系统时间。如果想要让ntp同时同步硬件时间,可以设置/etc/sysconfig/ntpd 文件。

    在/etc/sysconfig/ntpd文件中,添加 SYNC_HWCLOCK=yes 这样,就可以让硬件时间与系统时间一起同步。

    5. HPC集群中时间同步示例
    5.1 集群环境简介

    管理节点:192.168.0.100,192.168.0.101
    计算节点:192.168.0.1~192.168.0.50
    I/O节点:192.168.0.51~192.168.0.54
    Internet NTP服务器:cn.pool.ntp.org

    5.2 时间同步方案设计
    在这里插入图片描述

    方案详细解释:

    (1)管理节点1作为主NTP服务器,跟互联网NTP服务器进行时间同步;管理节点2作为备用NTP服务器,也跟互联网NTP服务器进行时间同步。两个管理节点做Heartbeat,设置一个漂移IP地址192.168.0.103,并对ntpd服务进行双机高可用;
    (2)集群计算节点和IO节点,跟管理节点的虚拟IP地址192.168.0.103通过ntpd服务做时间同步;
    (3)所有节点,在ntp时间同步的同时,设置硬件时间跟系统时间一致;
    (4)所有计算节点和IO节点开机时,通过ntpdate跟192.168.0.103进行时间同步,然后再开启ntpd服务。

    展开全文
  • Linux 操作系统状态查看及调优

    万次阅读 2021-07-17 07:34:41
    Linux 系统调优

    •  查看 Memory 运行状态相关工具
    •  查看 IO 运行状态相关工具
    •  查看 Network 运行状态相关工具
    •  查看系统整体运行状态

    • 系统调优思路

    • 性能优化就是找到系统处理中的瓶颈以及去除这些的过程,性能优化其实是对 OS 各子系统达到一种平衡的定义。

    • 具体步骤如下:
    • 系统的运行状况: CPU -> MEM -> DISK-> NETWORK -> application

    • 分析是否有瓶颈(依据当前应用需求)

    • 调优(采取一定措施使变得优异)

    • 这些子系统之间关系是相互彼此依赖的,任何一个高负载都会导致其他子系统出现问题.比如:
    • 大量的网页调入请求导致内存队列的拥塞;
    • 网卡的大吞吐量可能导致更多的 CPU 开销;
    • 大量的 CPU 开销又会尝试更多的内存使用请求;
    • 大量来自内存的磁盘写请求可能导致更多的 CPU 以及 IO 问题;
    • 所以要对一个系统进行优化,查找瓶颈来自哪个方面是关键,虽然看似是某一个子系统出现问题,其实有可能是别的子系统导致的。
    • 调优就像医生看病,因此需要你对服务器所有地方都了解清楚。

    • 查看 CPU 负载相关工具

    • 使用 uptime 命令查看系统 cpu 负载
    •  uptime 
       07:38:47 up 16:41,  1 user,  load average: 0.04, 0.04, 0.08
    • 其内容如下:
      07:38:47        当前时间
      up 16:41         当前系统运行时间,上次开机(重启)到目前的运行时间
      1 user             当前登录用户数
      load average:   0.04, 0.04, 0.08
      系统负载,即任务队列的平均长度。 三个数值分别为 1 分钟、5分钟、15 分钟前到现在的平均值

    • 例:找出前当系统中,CPU 负载过高的服务器?
      服务器 1: load average: 0.15, 0.08, 0.01 1 核
      服务器 2: load average: 4.15, 6.08, 6.01 1 核 
      服务器 3: load average: 7.15, 7.08, 7.01 4 核 
      答案:服务器 2 负载过高。
    • 经验:单核心,1 分钟的系统平均负载不要超过 3,就可以,4 核心不要超过 12,这是个经验值。
    • 所以如果服务器的 CPU 为 1 核心,则 load average 中的数字 >=3 负载过高,如果服务器的 CPU 为4 核心,则 load average 中的数字 >=12 负载过高。
    • 任务队列的平均长度是:是系统等待运行队列的长度与当前所有 CPU 中正在运行的工作的和。
    • 就像如图大家正在 3 号窗口排队买票,3 号窗口的队列就是 4 人。
      大厅排除买票:

    • 如下图单核 cpu 的任何队列长度为 3,包括正在运行的进程

    • 找出系统中使用 CPU 最多的进程
      运行 top 命令,按下大写的 P,可以按 CPU 使用率来排序显示

    • top 中 VIRT、RES 和 SHR 的含意:
      VIRT:virtual memory usage 虚拟内存
      进程“需要的”虚拟内存大小,包括进程使用的库、代码、数据等;
      假如进程申请 70m 的内存,但实际只使用了 7m,那么它会增长 70m,而不是实际的使用量。

    • RES:resident memory usage 常驻内存
      进程当前使用的内存大小,但不包括 swap out;
      包含其他进程的共享;
      如果申请 70m 的内存,实际使用 7m,它只增长 7m,与 VIRT 相反;
      关于库占用内存的情况,它只统计加载的库文件所占内存大小。

    • SHR:shared memory 共享内存
      除了自身进程的共享内存,也包括其他进程的共享内存;
      虽然进程只使用了几个共享库的函数,但它包含了整个共享库的大小;
      计算某个进程所占的物理内存大小公式:RES – SHR;
      swap out 后,它将会降下来。

    • htop 工具

    • 在上图中将输出的界面划分成了四个区域,其中:
    • 上左区:显示了CPU、物理内存和交换分区的信息
    • 上右区:显示了任务数量、平均负载和连接运行时间等信息
    • 进程区域:显示出当前系统中的所有进程
    • 操作提示区:显示了当前界面中F1-F10功能键中定义的快捷功能

    • M:按照内存使用百分比排序,对应MEM%列;
    • P:按照CPU使用百分比排序,对应CPU%列;
    • T:按照进程运行的时间排序,对应TIME+列;
    • K:隐藏内核线程;
    • H:隐藏用户线程;
    • #:快速定位光标到PID所指定的进程上。
    • F1:显示帮助信息; 

    •  F2:配置界面中的显示信息

    • 可以根据自己的需要修改显式模式以及想要显示的内容
    • 比如:以LED的形式显示CPU的使用情况,并且在左边的区域添加hostname,在右边的区区域添加clock
    • 方向键选择左右上下

    • F3:进程搜索;
    • 再次按下 F3 搜索下一个

    • F4:进程过滤器; 从上面的结果可以看出search和filter的区别: search会将光标定位到符合条件的进程上,通过F3键进行逐个查找;而filter会直接将符合条件的进程筛选出来。 search和filter都使用ESC键来取消功能。
    • F5:显示进程树;
    • F6:排序:
    • 比如 P  选择 CPU 列,按照 PID  回车排序  

    • F7:减小nice值; F8:增加nice值; 直接修改光标选取的进程的nice值:

    • F9:杀掉指定进程;

    •  F10:退出htop。 空格键:用于标记选中的进程,用于实现对多个进程同时操作;

    • -u:显示指定用户的进程;

    •  l:显示光标所在进程的文件列表;

    • 大写 i 反转显示


    • 按照实际使用 CPU,从大到小排序显示所有进程列表
      ps -aux --sort -pcpu | more                 #按 cpu 降序排序
      (使用率) 
    • 注: -pcpu 可以显示出进程绝对的路径,方便找出木马程序运行的路径。

    • 查看 CPU 信息

    • 使用 mpstat 查看 CPU 运行情况
      rpm -qf `which mpstat`                 #查看安装 mpstat 命令的安装包。
      sysstat-10.1.5-19.el7.x86_64       #此软件包,包括很多查看系统状态的软件包。
      mpstat  

    • 注:每列参数说明
      usr:用户空间 CPU 使用占比。
      nice:低优先级进程使用 CPU 占比。nice 值大于 0。
      sys:内核空间 CPU 使用占比。
      iowait:CPU 等待 IO 占比。
      irq:CPU 处理硬中断占比。
      soft:CPU 处理软中断占比。
      idle:CPU 空闲时间占比。
      guest 与 steal 与虚拟机有关,暂不涉及。
    • mpstat -P ALL #查看所有 CPU 运行状态

    • mpstat -P ALL 1 10                        # 一秒钟刷新一次 连续刷新 10 次  

    • 查看 Memory 运行状态相关工具
      free 命令查看内存使用情况

    • 注:在 centos7 系统中 available 这一列是真正可用内存。
    • available 包括了 buff/cache 中一些可以被释放的内存。当物理内存不够用的时候,内核会把非活跃的数据清空。 

    •  通过/proc 目录,查看非活跃的内存:
      /proc 文件系统下的多种文件提供的系统信息不是针对某个特定进程的,而是能够在整个系统范围的上下文中使用。可以使用的文件随系统配置的变化而变化。
      cat /proc/meminfo  

    •  注:当内存不够用时,kernel 总是把不活跃的内存交换到 swap 空间。如果 inactive 内存多时,加swap 空间可以解决问题,而 active 多,则考虑加内存。
    • 找出系统中使用内存最多的进程?
      方法 1:运行 top,然后按下大写的 M 可以按内存使用率来排序显示

    • 方法 2:按照实际使用内存,从大到小排序显示所有进程列表

    • ps -aux --sort -rss | more 内存降序排序(去掉减号就是升序)
    • 或:
    • ps -aux --sort -rss > a.log   


    • 查看 IO 运行状态相关工具

    • 查看文件系统块大小 

    • 对于 ext4 文件系统,查看文件系统块大小 

    • tune2fs -l /dev/sda1 | grep size

    • 对于 xfs 文件系统,查看文件系统块大小

     xfs_growfs -l /dev/sda1 |grep bsize

    • 找出系统中对磁盘读写最多的进程

    •  通过iostat命令查看IO是否存在瓶颈

    • iostat -d -k -p /dev/sda 

    •   常用参数:

    -d 仅显示磁盘统计信息。
    -k 以K为单位显示每秒的磁盘请求数,默认单位块。
    -p device | ALL 用于显示块设备及系统分区的统计信息。

    • 注:
      每列含意:
      kB_read/s 每秒从磁盘读入的数据量,单位为K.
      kB_wrtn/s 每秒向磁盘写入的数据量,单位为K.
      kB_read 读入的数据总量,单位为K.
      kB_wrtn 写入的数据总量,单位为K.
    • 测试,给磁盘写入一些内容, 写入时尽可能不读磁盘?
      dd if=/dev/zero of=/tmp/test.txt bs=10M count=500 ; sync 
      读入的数据用/dev/zero,/dev/zero不会读磁盘的。
      sync       #把内存中的数据快速写到磁盘上。 只做dd不执行sync,不容易看不出写入效果
    • 另外开一个 shell
    • watch iostat -p sda -dk

    • 如果服务器很卡,查看CPU使用率不高,内存也够用,但就是卡,尤其是打开新程序或文件时,更卡。此时是哪出问题了? 

    • 这时系统的瓶颈在哪里? 在磁盘IO上。使用iotop命令,查看哪个进程使用磁盘读写最多。

    • iotop的参数:
      -o, -only 只显示在读写硬盘的程序
      -d SEC, -delay=SEC 设定显示时间间隔。 刷新时间
      iotop 常用快捷键:
      <- / ->:左右箭头:改变排序方式,默认是按 IO 排序。
      r:改变排序顺序。
      o:只显示有 IO 输出的进程。
      p:进程/线程的显示方式的切换。
      a:显示累积使用量。
      q:退出,按 q 或 ctrl+C

    • 例1:找出使用磁盘最多的进程 

    • iotop -o -d 1                #显示正在使用磁盘的进程

    • 在另一个终端对磁盘进行大量读操作,执行:
      find /
      查看结果: 


    • 查看 Network 运行状态相关工具,找出系统中使用网络最多的进程
      使用nload监控总体带宽使用情况

      yum install nload -y

    • 开始监控
      nload

    • 然后另一个终端上运行ab,开始测试:
    • ab -n 700 -c 2 http://www.baidu.com/index.html                          #产生一些测试数据
      查看结果: 

    •  使用nethogs找出使用带宽最多的进程

    • yum安装
      yum install -y nethogs
      nethogs

    • 在另一个终端生成一些数据:
      wget http://issuecdn.baidupcs.com/issue/netdisk/yunguanjia/BaiduNetdisk_5.5.3.exe
      查看结果,找出wget是使用流量最多的进程


    • 查看系统整体运行状态
      使用 vmstat 查看内存及系统整体运行状态 

    •  vmstat :命令是最常见的 Linux/Unix 监控工具,可以展现给定时间间隔的服务器的状态值,包括服务器的 CPU 使用率,MEM 内存使用,VMSwap 虚拟内存交换情况,IO 读写情况。
    • 使用 vmstat 可以看到整个机器的 CPU,内存,IO 的使用情况,而不是单单看到各个进程的 CPU 使用率和内存使用率。 比 top 命令节省资源。
    • 注:当机器运行比较慢时,建议大家使用 vmstat 查看运行状态,不需要使用 top,因 top 使用资源比较多。
    • 例:

    • 每一列参数作用:
      r        运行状态的进程个数 。展示了正在执行和等待 cpu 资源的任务个数。当这个值超过了 cpu 个数,就会出现 cpu 瓶颈 
    • b       不可中断睡眠 正在进行 i/o 等待--阻塞状态的进程个数 进程读取外设上的数据,等待时
      free   剩余内存,单位是 KB
      buff          #内存从磁盘读出的内容
      cache   #内存需要写入磁盘的内容
      si swapin swap      换入到内存
      so swapout           内存换出到 swap 换出的越多,内存越不够用
      bi blockin              从硬盘往内存读。 单位是块。 把磁盘中的数据读入内存
      bo blockout          从内存拿出到硬盘 (周期性的有值) 写到硬盘
      #判断是读多还是写多,是否有 i/o 瓶颈
      in                        系统的中断次数,cpu 调度的次数多
      cs                       每秒的上下文切换速度 
      CPU                  上下文切换--程序在运行的时候,CPU 对每个程序切换的过程。
      更多内存参以一下表格: vmstat 每个字段含义说明 

    • 使用 sar 命令记录系统一段时间的运行状态
    • sar 工具可以把检查到的信息保存下来,存在/var/log/sa 目录下。
    • sar 默认显示每10分钟统计一次状态信息(从装 sysstat 包开始)
    • sar 命令行的常用格式: sar [options] [-A] [-o file] t [n]
      在命令行中,n 和 t 两个参数组合起来定义采样间隔和次数,t 为采样间隔,是必须有的参数,n 为采样次数,是可选的,默认值是 1,-o file 表示将命令结果以二进制格式存放在文件中,file 在此处不是关键字,是文件名。options 为命令行选项
    • sar 命令的选项很多 下面只列出常用选项:
    • 下面只列出常用选项:
      -A:所有报告的总和。
      -n:网络接口的情况。
      -u:CPU 利用率
      -v:进程、I 节点、文件和锁表状态。
      -d:硬盘使用报告。
      -r:没有使用的内存页面和硬盘块。
      -g:串口 I/O 的情况。
      -b:缓冲区使用情况。
      -a:文件读写情况。
      -c:系统调用情况。
      -R:进程的活动情况。
      -y:终端设备活动情况。
      -w:系统交换活动。
      -o 文件名:打印到屏幕并将采样结果以二进制形式存入当前目录下的文件中。
      -f 文件名:查看之前保存的二进制文件。
      -d:显示磁盘。
      -d 1 70 #必须得指定次数。
      -c:每秒创建进程的个数。
      -i 1 7 #指定时间间隔。
      -P:查看 cpu。
      -r:查看内存。
      -w:每秒上下文切换次数。
      -o /cpu.sar #保存并显示。
      -f cpu.sar #读取。
    • 每 2 秒采样一次,连续采样 5 次,观察 CPU 的使用情况,并将采样结果以二进制形式存入当前目录下的文件 cpu.sar 中
      sar -u 2 5 -o cpu.sar         #屏幕显示以一下内容,同时内容也会写到当前目录的./cpu.sar 中

    • 在显示内容包括:
      %usr:CPU 处在用户模式下的时间百分比。
      %system:CPU 处在系统模式下的时间百分比。
      %iowait:CPU 等待输入输出完成时间的百分比。
      %idle:CPU 空闲时间百分比。
      在所有的显示中,我们应主要注意%iowail 和%idle
    • %iowail 的值过高,表示硬盘存在 I/O 瓶颈,%idle 值高,表示 CPU 较空闲,如果%idle 值高但系统响应慢时,有可能是 CPU 等待分配内存,此时应加大内存容量
    • %idle 值如果持续低于 7,那么系统的 CPU 处理能力相对较低,表明系统中最需要解决的资源是 CPU
    • 查看二进制文件 cpu.sar 中的内容
      sar -u -f cpu.sar 
      注:sar 命令即可以实时采样,又可以对以往的采样结果进行查询

    • 查看 sar 的计划任务并读取日志
      查看 sar 的计划任务cat /etc/cron.d/sysstat                                                                                                                          ???127?
      # Run system activity accounting tool every 10 minutes
      */10 * * * * root /usr/lib64/sa/sa1 1 1                     默认每10分钟执行一次
      # 0 * * * * root /usr/lib64/sa/sa1 600 6 &
      # Generate a daily summary of process accounting at 23:53
      53 23 * * * root /usr/lib64/sa/sa2 -A

    •  注:生成的日志位置:
    •  ls /var/log/sa

    •  读取日志
      ls /var/log/sa                #只要安装 sar 后就会定期收集系统信息。
    • 注:sa 开头的文件不能使用 cat 命令进行查看,只能使用 sar -f 进行查看,文件名命名规则 sa+日期,sa01 表示这个月的第一天。文件名会根据日期进行排序,sa01、sa02 ……
    • 使用参数-n 查看网络接口流量情况:
      sar -n DEV -f /var/log/sa/sa16          #查看网络相关信息。 

    • 查看内存和硬盘
      sar -r -f /var/log/sa/sa17
      -r 查看内存

    •  sar -d -f /var/log/sa/sa17

    -d:硬盘使用报告 

    • sar 最大特点是可以监控所有状态,sar 的其他使用方法如下:
      sar -r 1         #查看内存
      sar -n ALL    #查看所有
      sar -b 1 7     #缓冲区使用情况,每秒刷新一次,查看 7 次
      sar -I ALL 1 7
      sar -r -f /tmp/file -n -r -b -m
      sar -s 15:00:00 -e 15:30:00           #查看某个时间段,系统运行情况
      sar -s 15:00:00 -e 15:30:20 -f /var/log/sa/sa17
      sar -r -s 15:00:00 -e 15:30:20 -f /var/log/sa/sa17


    • CPU-IO-网络-内核参数的调优

    • 调 整 nice 值 改 变 进 程 优 先 级
      nice 概述:在 LINUX 系统中,Nice 值的范围从-20 到+19(不同系统的值范围是不一样的),正值表示低优先级,负值表示高优先级,值为零则表示不会调整该进程的优先级。具有最高优先级的程序,其 nice 值最低,所以在 LINUX 系统中,值-20 使得一项任务变得非常重要;与之相反,如果任务的 nice为+19,则表示它是一个高尚的、无私的任务,允许所有其他任务比自己享有宝贵的 CPU 时间的更大使用份额,这也就是 nice 的名称的来意。默认优先级是 0
    • 在命令运行前,调整进程 nice 值,让进程使用更多的 CPU
    • 语法: nice -n 优先级数字 命令
    • 例:将 vim test.txt 命令的优先级,从默认的 0 级别调高到-5 级别
       
    • pidof vim   得到进程的 PID
    • top -p PID    只查看某进程
    • 看得出默认 nice 值为 0

    • nice -n -5 vim test.txt             #先不要退出这个 vim 命令,另外打开一个shell
    • NI 值 为5

    • 使用 renice 修改正在运行的进程的优先级
      语法:renice -n [NUM] PID      #修改进程优先级
    • 将先前 vim 的 PID 92336  优先级调整为级别 10
    • renice -n 10 92336

    •  注:进程优先级不可以超过 -20 到 19 范围

    • 设 置 进 程 的 CPU 亲 和 力
      taskset 作用:在多核的情况下,可以认为指定一个进程在哪颗 CPU 上执行程序,减少进程在不同CPU 之前切换的开销。
      安装 taskset 命令: 
    • yum -y install util-linux

    • taskset 语法: taskset -cp [CPU ID 号] 命令或进程 ID
      常用参数:
      -p, --pid 在已经存在的 pid 上操作
      -c, --cpu-list 以列表格式显示和指定 CPU
    • 服务器是 4 核 CPU ,指定 vim 命令在第一个 CPU 上运行 
    •  taskset -c 0 vim test.txt        #第一个 CPU 的 ID 是 0。

    • 查 sshd 进程运行在哪几个 CPU 上
    • pidof sshd
      91909 91586 87896 82726 6471
      taskset -cp 91586
      pid 91586's current affinity list: 0-3         #0-3 说明 sshd 进程可以使用 4 个 CPU 核心处理数据。

    •  指定 vim c.txt 程序运行在第 2 和第 4 个 CPU 上

    taskset -c 1,3 vim test.txt

    • 使 用 vmstat 找 出 系 统 中 存 在 瓶 颈
      CPU 利用率比例分配:
      如果一个 CPU 被充分使用,利用率分类之间均衡的比例应该是。

    65% ­ 70% User Time         #用户态(通常指我们运行的服务和程序)。
    30% ­ 35% System Time    #内核态。
    0% ­ 5% Idle Time              #空闲。

    •  Context Switches ­ 上下文切换的数目直接关系到 CPU 的使用率,如果 CPU 利用率保持在上述均衡状态时,有大量的上下文切换是正常的。 
    • 上下文切换指的就是 cpu 中寄存器数据的写入和读出。每个进程在使用 cpu 时,都需要把自己的数据先写入 cpu 的缓存(寄存器)中,然后 cpu 才能根据缓存中的数据来计算。
    •  一台 4 核心,8G 内存的服务器,根据 vmstat 运行的结果,来分析系统中存在的问题。
      学会这个思路,后期就可以很轻松分析出 8 核心,16G 或 8 核心,32G 服务器的瓶颈。

    • vmstat 输出每列字段的意义:

    • Procs(进程):
      r: The number of processes waiting for run time. 等待运行的进程数。如果等待运行的进程数越多,意味着 CPU 非常繁忙。另外,如果该参数长期大于 cpu 核心数 3 倍,说明 CPU 资源可能存在较大的瓶颈
      b: The number of processes in uninterruptible sleep.处在非中断睡眠状态的进程数。即等待 IO 的进程数量。
    • Memory(内存):
      swpd: the amount of virtual memory used.已使用的虚拟内存大小。如果虚拟内存使用较多,可能系统的物理内存比较吃紧,需要采取合适
      的方式来减少物理内存的使用。swapd 不为 0,并不意味物理内存吃紧,如果 swapd 没变化,si、so 的值长期为 0,这也是没有问题的 。
      free: the amount of idle memory.空闲的物理内存的大小
      buff: the amount of memory used as buffers.用来做 buffer(缓存,主要用于块设备缓存)的内存数,单位:KB
      cache: the amount of memory used as cache.用作缓存的内存大小,如果 cache 的值大的时候,说明 cache 处的文件数多,如果频繁访问到
      的文件都能被 cache 处,那么磁盘的读 IO bi 会非常小。单位:KB
       
    • Swap(交换分区)
    • si: Amount of memory swapped in from disk (/s).
      从磁盘写入到 swap 虚拟内存的交换页数量,单位:KB/秒。如果这个值大于 0,表示物理内存不够用或者内存泄露了。
      so: Amount of memory swapped to disk (/s).
      从 swap 虚拟内读出的数据。即从 swap 中的数据写入到磁盘的交换页数量,单位:KB/秒,
      如果这个值大于 0,表示物理内存不够用或者内存泄露了。

    • 内存够用的时候,si so  2 个值都是 0,如果这 2 个值长期大于 0 时,系统性能会受到影响,磁盘 IO和 CPU 资源都会被消耗。

    • 当看到空闲内存(free)很少的或接近于 0 时,就认为内存不够用了,这个是不正确的。不能光看这一点,还要结合 si 和 so。如果 free 很少,但是 si 和 so 是 0,那么不用担心,系统性能这时不会受到影响的。

    • IO(这里指 Input/Output Memery 的数据,即 bi:进入内存,bo:从内存中出去
      bi: Blocks received from a block device (blocks/s).
      每秒从块设备接收到的块数,单位:块/秒 也就是读块设备。bi 通常是读磁盘的数据
      bo: Blocks sent to a block device (blocks/s).
      每秒发送到块设备的块数,单位:块/秒 也就是写块设备。bo 通常是写磁盘的数据
       
    • System(系统)
      in: The number of interrupts per second, including the clock.
      每秒的中断数,包括时钟中断。
      cs: The number of context switches per second.
      每秒的环境(上下文)切换次数。比如我们调用系统函数,就要进行上下文切换,而过多的上下文切换会浪费较多的 cpu 资源,这个数值应该越小越好。
    • CPU(使用 cpu 时间的百分比%,最大 100%)
      us: Time spent running non-kernel code. (user time, including nice time)
      用户 CPU 时间(非内核进程占用时间)(单位为百分比)。 us 的值比较高时,说明用户进程消耗的 CPU 时间多
      sy: Time spent running kernel code. (system time)
      系统使用的 CPU 时间(单位为百分比)。sy 的值高时,说明系统内核消耗的 CPU 资源多,这并不是良性表现,我们应该检查原因。
      id: Time spent idle. Prior to Linux 2.5.41, this includes IO-wait time.
      空闲的 CPU 的时间(百分比),在 Linux 2.5.41 之前,这部分包含 IO 等待时间。
      wa: Time spent waiting for IO. Prior to Linux 2.5.41, shown as zero.
      等待 IO 的 CPU 时间,这个值为 0 .这个指标意味着 CPU 在等待硬盘读写操作的时间,用百分比表示。wait 越大则机器 io 性能就越差。说明 IO 等待比较严重,这可能由于磁盘大量作随机访问造成,也有可能磁盘出现瓶颈(块操作)
      st: 虚拟机占用 cpu 时间的百分比。如果 centos 系统上运行了 kvm 虚拟机,而 kvm 虚拟上又运行了几个虚拟机,那么这个值将显示这个几个正在运行的虚拟机从物理机中窃取 CPU 运行时间的百分比。 
    • 当系统刚开机后,一切正常时,vmstat 的状态。
      vmstat 1 10

     

    • 注:根据观察值,我们可以得到以下结论:
      1、第 1 列 r(run),有个 1,很多次是 0,说明当前系统中正在运行的进程不多,此值大于 cpu核心数 3 倍时,我们认为是 cpu 是繁忙的。当前情况下: r > 12,才算忙。
      2、第 4 列 free 是物理内存剩余数。默认单位是 KB,现还有 7284516KB,所以内存肯定够用。
      3、第 7 和 8 列 swap 是 swap 内存交换分区使用情况。如果这两列有数据,说明我们已经使用了 swap交换分区了,那么系统的内存肯定不够用了,需要加内存。
      4、第 9 和 10 列 io,如果 io 这组数据中 bi 比较大,说明从磁盘读进内存的数据比较大,即读磁盘数据多。bo 比较大,说明从内存写入到磁盘的数据比较多,即说明写磁盘比较多。
      5、第 13 和 15 列 cpu 数据组中的 us 是用户太进程使用 cpu 时间的百分比。如果 us 列数据比较大,说明用户态的进程如 apache,mysql 等服务使用 cpu 比较多。 id 这列是 cpu 空闲时间(%)。此列最大值是 100%
      6、第 16 列,即倒数第二列 wa(等待 IO 所消耗的 CPU 时间百分比),如果此占用 cpu 的百分比比较大,如到达了 40%,说明磁盘读写速度太慢,IO 有瓶颈了。具体是 bi 或 bo 的问题,可以查看一下 bi和 bo 列的数值。如果 bi 列值很大,说明进程在等待写入磁盘数据时,占用了大量 cpu。 

    上传一个比较大的文件到 linux 系统中,分析系统资源使用情况。上传文件是只写磁盘,不读磁盘。
    vmstat 1 1000               #开始长时间监控系统。
    然后开始上传一些文件系统中。上传的文件大家可以随意找一些文件上传,只要大于 1G 就可以了。大于 1G,可以上传的时间长一些,方便看出来效果。

    • 注:根据观察值,我们可以得出结论:
    • 因为只是上传文件到 linux 系统中,在上传文件过程中没有读磁盘,所以 bi 的值一直为 0;
    • 但是上传文件时会写入磁盘,所以 bo 这列会有大量数据。
    • r 列,free 列,us 列,id 列,wa 列数据不多,说明 cpu,内存,io 都还可以,压力不大。 

    • 将/lib64 目录复制到/opt 下,模拟生产环境下备份数据的情景。在复制的过程中查看一下系统的状态。
    • du -sh /lib64/
      228M /lib64/
      cp -r /lib64/ /opt/

    • 注:根据观察值,我们可以得出结论:
      因为我们是复制文件,所以 bi 和 bo 都会有大量数据。
      r 列,free 列数据不大,说明正在运行的进程数不多,内存也够用。
      查看 r 列最大数据是 3,r 列如果超过 12 则认为 cpu 核心数不够用。所以当前运行的进程不多,cpu 核心数够用。
    • 查看 us 列、sy 列、wa列、使用 cpu 不多如果 wa 列使用 cpu 很多。说明当前系统的瓶颈是磁盘读写太慢。因为大量进程都处在等待读写磁盘上这件事上。
    • 总结:通过 wa 列是最容易看出磁盘读写速度是否太慢。  

    •  使用  apache 的压测工具 ab 对系统进行测试
    • ab -n 500000 -c 200 http://192.168.2.3/index.html

    •  注:根据观察值,我们可以得出结论:
      r 列有几个数值已经超过 12 了,说明 cpu 核心数不够用了。

    • wa 列为 0,说明在读写磁盘等待上,没有占用 cpu。
    • 这样情况就是服务器上运行了大量进程,在消耗 cpu。可以使用 ps 查看一下有哪个进程,另外,也可以运行 top 命令再按 P,来查看一下哪些进程在大量使用 cpu。
    • 扩展:关于 buff 和 cache 内存
      BUFFER inode 节点索引缓存;   CACHE block 块/页缓存。
      buffers             #缓存从磁盘读出的内容 ,这种理解是片面的
      cached            #缓存需要写入磁盘的内容 ,这种理解是片面的
      不过现在在 centos7 下,free 命令已有变化,free 直接给出了可用空余内存 available。增加了-h选项,支持以人性化的单位(K/M/G)显示各个数值。如下:


    • 有关磁盘 I/O 的调优
      ulimit 资 源 限 制

    • 限制用户资源配置文件:/etc/security/limits.conf
    • 每行的格式:用户名/@用户组名 类型(软限制/硬限制) 选项 值
    • 永久修改一个进程可以打开的最大文件数
    • vim /etc/security/limits.conf      #在文件的最后追加以下内容
    • *  -  nofile 655350      #理论上大于 65535 即可

    • 注:soft 是一个警告值,而 hard 则是一个真正意义的阀值,超过就会报错。一般把 soft 和 hard 都配置成一样的值。 最大打开的文件数以文件描叙符 file descripter 计数)。
    • ulimit -n             #查看一个进程可以打开的文件数,默认是 1024
    • init 6                  #想要刚修改的 limits.conf 中配置永久生效,必须重启系统
    • 临时修改
      ulimit -n 655350         #不用重启系统。
      ulimit -n 

    • nproc #配置一个用户可以打开的最大进程数
      vim /etc/security/limits.d/20-nproc.conf 
      改:
      5 * soft nproc 4096
      为:
      5 * soft nproc 65535
      6 * hard nproc 65535

    • 临时修改
    • ulimit -u 65535 
    • 注:如果默认一个用户,比如 apache 可用的最大进程数是 1024.那么 apache 用户启动的进程就数就不能大于 1024了。 
    • 查询系统中进程占用的句柄数

      使用的命令是:

    • lsof -n|awk '{print $2}'|sort|uniq -c|sort -nr|more


    •  查 看 所 有 的 资 源 限 制 信 息

    • core file size (blocks, -c) 0 kdump         转储功能打开后产生的 core file 大小限制
      data seg size (kbytes, -d) unlimited       数据段大小限制
      scheduling priority (-e) 0
      file size (blocks, -f) unlimited                 文件大小限制
      pending signals                 (-i) 31117
      max locked memory (kbytes, -l) 64
      max memory size (kbytes, -m) unlimited
      open files (-n) 655350                            打开的文件个数限制
      pipe size (512 bytes, -p) 8                      管道大小的限制
      POSIX message queues (bytes, -q) 819200     消息队列大小real-time priority (-r) 0
      stack size (kbytes, -s) 8192                  栈大小
      cpu time (seconds, -t) unlimited           CPU 时间使用限制
      max user processes (-u) 65535            最大的用户进程数限制
      virtual memory (kbytes, -v) unlimited    虚拟内存限制

      file locks (-x) unlimited 
    •  

    • 测 试 硬 盘 速 度
      一般情况下使用 hdparm 来测试磁盘顺序读的速度。dd 命令用来测试磁盘顺序写的速度。
      hdparm 命令常用参数
      参数:
      -t perform device read timings            #不使用预先的数据缓冲, 标示了 Linux 下没有任何文件系统开销时磁盘可以支持多快的连续数据读取. perform [pəˈfɔ:m]                                #执行
      --direct Use O_DIRECT to bypass page cache for timings         #直接绕过缓存进行统计数据
    • hdparm -t --direct /dev/sda

    •  注: 弹出的含意是 3.00 秒中从硬盘缓存中读 5302M,平均每秒读 1764.87MB/sec
    • 使用 dd 命令测试磁盘 IO 的顺序写和读速度
      在使用前首先了解两个特殊设备:/dev/null 伪设备,回收站.写该文件不会产生 IO 开销;/dev/zero 伪设备,会产生空字符流,读该文件不会产生 IO 开销
    • dd if=/dev/zero of=/tmp/test.dbf bs=1M count=5000 oflag=direct,nonblock
      5000+0 records in
      5000+0 records out
      5242880000 bytes (5.2 GB) copied, 23.4296 s, 224 MB/s

    •  注:可以看到,在  23.4296 秒的时间里,生成 5000M 的一个文件,IO 写的速度约为 224 MB/秒,这就是硬盘顺序写速度了。当然这个速度可以多测试几遍取一个平均值。
      注:oflag=direct,nonblock 中的 direct 表示读写数据采用直接 IO 方式;nonblock 表示读写数据采用非阻塞 IO 方式,这样绕开缓存,测试的更准确。
      总结:在生产环境下,建议使用 hdparm 来测试磁盘读,使用 dd 来测试磁盘写速度 

    •  time 命 令 测 试 进 程 运 行 时 间
      time 命令: 执行命令并计时 
      测试 dd 命令使用时间和开销
    • time dd if=/dev/zero of=/tmp/test.dbf bs=1M count=5000 oflag=direct,nonblock

    •  1)实际时间(real time): 从 command 命令行开始执行到运行终止的消逝时间;

    2)用户 CPU 时间(user CPU time): 命令执行完成花费的用户 CPU 时间,即命令在用户态中执行时间总和;
    3)系统 CPU 时间(system CPU time): 命令执行完成花费的系统 CPU 时间,即命令在核心态中执行时间总和。
    其中,用户 CPU 时间和系统 CPU 时间之和为 CPU 时间,即命令占用 CPU 执行的时间总和。实际时间要大于 CPU 时间,因为 Linux 是多任务操作系统,往往在执行一条命令时,系统还要处理其它任务。
    排队时间没有算在里面。
    另一个需要注意的问题是即使每次执行相同命令,但所花费的时间也是不一样,其花费时间是与系统运行相关的


    • 内核参数调优

    • 使用netstat命令去查TIME_WAIT状态的连接状态,输入下面的组合命令,查看当前TCP连接的状态和对应的连接数量:
      netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
      ESTABLISHED 1
      SYN_SENT 2
      TIME_WAIT 49
    • 调整下Linux的TCP内核参数,让系统更快的释放TIME_WAIT连接。

      用vim打开配置文件:vim /etc/sysctl.conf

      在这个文件中,加入下面的几行内容:
      net.ipv4.tcp_syncookies = 1
      net.ipv4.tcp_tw_reuse = 1
      net.ipv4.tcp_tw_recycle = 1
      net.ipv4.tcp_fin_timeout = 30

      输入下面的命令,让内核参数生效:sysctl -p

    • sysctl -p
      net.ipv4.tcp_syncookies = 1
      net.ipv4.tcp_tw_reuse = 1
      net.ipv4.tcp_tw_recycle = 1
      net.ipv4.tcp_fin_timeout = 30

    • 简单的说明上面的参数的含义:

      net.ipv4.tcp_syncookies = 1   #表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭;
      net.ipv4.tcp_tw_reuse = 1     #表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭;
      net.ipv4.tcp_tw_recycle = 1   #表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭;
      net.ipv4.tcp_fin_timeout    #修改系統默认的 TIMEOUT 时间。

    • 在经过这样的调整之后,除了会进一步提升服务器的负载能力之外,还能够防御小流量程度的DoS、CC和SYN攻击

    • 优化一下TCP的可使用端口范围,进一步提升服务器的并发能力。依然是往上面的参数文件中,加入下面这些配置:
      net.ipv4.tcp_keepalive_time = 1200
      net.ipv4.ip_local_port_range = 10000 65000
      net.ipv4.tcp_max_syn_backlog = 8192
      net.ipv4.tcp_max_tw_buckets = 5000

    • 这几个参数,建议只在流量非常大的服务器上开启,会有显著的效果。一般的流量小的服务器上,没有必要去设置这几个参数。

      net.ipv4.tcp_keepalive_time = 1200       #表示当keepalive起用的时候,TCP发送keepalive消息的频度。缺省是2小时,改为20分钟。
      net.ipv4.ip_local_port_range = 10000 65000    #表示用于向外连接的端口范围。缺省情况下很小:32768到61000,改为10000到65000。(注意:这里不要将最低值设的太低,否则可能会占用掉正常的端口!)
      net.ipv4.tcp_max_syn_backlog = 8192     #表示SYN队列的长度,默认为1024,加大队列长度为8192,可以容纳更多等待连接的网络连接数。
      net.ipv4.tcp_max_tw_buckets = 5000      #表示系统同时保持TIME_WAIT的最大数量,如果超过这个数字,TIME_WAIT将立刻被清除并打印警告信息。默认为180000,改为5000。对于Apache、Nginx等服务器,上几行的参数可以很好地减少TIME_WAIT套接字数量,但是对于 Squid,效果却不大。此项参数可以控制TIME_WAIT的最大数量,避免Squid服务器被大量的TIME_WAIT拖死

    • 内核其他TCP参数说明:


    • net.ipv4.tcp_max_syn_backlog = 65536     #记录的那些尚未收到客户端确认信息的连接请求的最大值。对于有128M内存的系统而言,缺省值是1024,小内存的系统则是128。
      net.core.netdev_max_backlog = 32768     #每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目。
      net.core.somaxconn = 32768      #web应用中listen函数的backlog默认会给我们内核参数的net.core.somaxconn限制到128,而nginx定义的NGX_LISTEN_BACKLOG默认为511,所以有必要调整这个值。

      net.core.wmem_default = 8388608
      net.core.rmem_default = 8388608
      net.core.rmem_max = 16777216         #最大socket读buffer,可参考的优化值:873200
      net.core.wmem_max = 16777216       #最大socket写buffer,可参考的优化值:873200
      net.ipv4.tcp_timestsmps = 0      #时间戳可以避免序列号的卷绕。一个1Gbps的链路肯定会遇到以前用过的序列号。时间戳能够让内核接受这种“异常”的数据包。这里需要将其关掉。
      net.ipv4.tcp_synack_retries = 2    #为了打开对端的连接,内核需要发送一个SYN并附带一个回应前面一个SYN的ACK。也就是所谓三次握手中的第二次握手。这个设置决定了内核放弃连接之前发送SYN+ACK包的数量。
      net.ipv4.tcp_syn_retries = 2        #在内核放弃建立连接之前发送SYN包的数量。
      net.ipv4.tcp_tw_reuse = 0        # 不开启重用。不允许将TIME-WAIT sockets重新用于新的TCP连接。

      net.ipv4.tcp_wmem = 8192 436600 873200    # TCP写buffer,可参考的优化值: 8192 436600 873200
      net.ipv4.tcp_rmem  = 32768 436600 873200   # TCP读buffer,可参考的优化值: 32768 436600 873200
      net.ipv4.tcp_mem = 94500000 91500000 92700000
      # 同样有3个值,意思是:
      net.ipv4.tcp_mem[0]:低于此值,TCP没有内存压力。
      net.ipv4.tcp_mem[1]:在此值下,进入内存压力阶段。
      net.ipv4.tcp_mem[2]:高于此值,TCP拒绝分配socket。
      上述内存单位是页,而不是字节。可参考的优化值是:786432 1048576 1572864

      net.ipv4.tcp_max_orphans = 3276800   #系统中最多有多少个TCP套接字不被关联到任何一个用户文件句柄上。如果超过这个数字,连接将即刻被复位并打印出警告信息。这个限制仅仅是为了防止简单的DoS攻击,不能过分依靠它或者人为地减小这个值,更应该增加这个值(如果增加了内存之后)。
      net.ipv4.tcp_fin_timeout = 30   #如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间。对端可以出错并永远不关闭连接,甚至意外当机。缺省值是60秒。2.2 内核的通常值是180秒,你可以按这个设置,但要记住的是,即使你的机器是一个轻载的WEB服务器,也有因为大量的死套接字而内存溢出的风险,FIN- WAIT-2的危险性比FIN-WAIT-1要小,因为它最多只能吃掉1.5K内存,但是它们的生存期长些。

    •  以上配置仅供参考,用于生产环境请根据自己的实际情况。

    • 内核 TCP/IP 优化

    • sysctl -p
      net.ipv6.conf.all.disable_ipv6 = 1
      net.ipv6.conf.default.disable_ipv6 = 1
      fs.file-max = 65535
      net.ipv4.tcp_max_tw_buckets = 60000
      net.ipv4.tcp_sack = 1
      net.ipv4.tcp_window_scaling = 1
      net.ipv4.tcp_rmem = 4096 87380 4194304
      net.ipv4.tcp_wmem = 4096 16384 4194304
      net.ipv4.tcp_max_syn_backlog = 65536
      net.core.netdev_max_backlog = 32768
      net.core.somaxconn = 32768
      net.core.wmem_default = 8388608
      net.core.rmem_default = 8388608
      net.core.rmem_max = 16777216
      net.core.wmem_max = 16777216
      net.ipv4.tcp_timestamps = 1
      net.ipv4.tcp_fin_timeout = 20
      net.ipv4.tcp_synack_retries = 2
      net.ipv4.tcp_syn_retries = 2
      net.ipv4.tcp_tw_recycle = 0
      net.ipv4.tcp_syncookies = 1
      net.ipv4.tcp_tw_reuse = 1
      net.ipv4.tcp_mem = 94500000 915000000 927000000
      net.ipv4.tcp_max_orphans = 3276800
      net.ipv4.tcp_tw_recycle = 1
      net.ipv4.ip_local_port_range = 1024 65535

    • 列出服务器上当前所有四元组连接的数量
    • ss -tan 'sport = :80' | awk '{print $(NF)" "$(NF-1)}' | sed 's/:[^ ]*//g' | sort | uniq -c
    展开全文
  • #include <stdio.h><br /> #include <sys/time.h><br /> #include <time.h><br /> ... //这里是linux编程,这个sleep是为单位的  gettimeofday(&tvafter, NULL);  <br /

    #include <stdio.h>
    #include <sys/time.h>
    #include <time.h>


     struct timeval tvpre, tvafter;
     gettimeofday(&tvpre, NULL);
    sleep(3);  //这里是linux编程,这个sleep是秒为单位的
     gettimeofday(&tvafter, NULL);
     
     ast_log(LOG_NOTICE,"prepaid_staff_log: test spend time is %d msecond./n", (tvafter.tv_sec-tvpre.tv_sec)*1000+(tvafter.tv_usec-tvpre.tv_usec)/1000);

    输出是3002毫秒

    这里要知道的是LINUX下sleep函数的参数是以秒为单位的,而wimdows下的是以毫秒为单位 

    还要注意一点是linux下的sleep函数是不精确的,当你需要非常精确时别依赖它

    展开全文
  • linux系统中的时间及操作函数

    千次阅读 2016-05-17 10:05:19
    (一)Linux系统中的时间 rtc 由rtc芯片提供的时间,可以转换为格林尼治时间linux中把这一类时间称为wall time,墙上时间。rtc时间由rtc芯片来维护更新,它通常由一个专门的计时硬件来实现,软件可以读取该...

    

    (一)Linux系统中的时间

     

    rtc

    由rtc芯片提供的时间,可以转换为格林尼治时间,linux中把这一类时间称为wall time,墙上时间。rtc时间由rtc芯片来维护更新,它通常由一个专门的计时硬件来实现,软件可以读取该硬件来获得年月日、时分秒等时间信息。rtc时间是可持续计时的,通常硬件上会加上一个后备电池供电,这样即使系统关闭,rtc时间依然是正常更新的,这样就可以保证下次系统起来的时候可以从rtc芯片中,重新读取到正确的墙上时间。

    xtime

    linux系统时间是用从Epoch(1970年1月1日00:00:00 UTC)开始所经过的时间来表示,比如unix时间戳就是从Epoch开始所经过的秒数。注意这里使用的是UTC世界统一时间标准来计算的,它也是一种墙上时间。

    monotonic time

    单调增长的系统运行时间(ntp影响其单调性), 记录的是从系统启动以来到当前的时间间隔,它不会像xtime一样可以被用户修改而发生跳变。不过该时间不计算休眠时间。

    raw monotonic time

    raw monotonic time: 该时间与monotonic时间类似,也是单调递增的时间,唯一的不同是,raw monotonic time不会受到NTP时间调整的影响,它代表着系统独立时钟硬件对时间的统计。

    boot time 

    它代表着系统上电后的总时间,包括了休眠时间。

     

    ntp服务会全部影响到上面提到的几种时间类型。ntp就是为了校正时间的服务,为了每次启动都能正确修改,所以rtc要更新,为了使当前时间也修改生效,所以xtime也要更新。

     

    (二)时间操作函数

     

    RTC时间操作:

    1.rtc时间是由rtc硬件控制的,所以在linux中想要修改和获取rtc时间就只能通过驱动的接口来获取和修改。

    int rtc_test(void)
    {
    struct rtc_time rtc;
    int fd = -1;
    int ret = -1;
    
    fd = open("/dev/rtc0", O_RDWR);
    if (fd < 0)
    { 
        return -1;
    }
    ret = ioctl(fd, RTC_RD_TIME, &rtc);
    if (ret < 0) {
        return -1;
    }
    printf("\nCurrentRTC data/time is %d-%d-%d, %02d:%02d:%02d.\n", 
        rtc.tm_mday, rtc.tm_mon + 1, rtc.tm_year + 1900, rtc.tm_hour, rtc.tm_min, rtc.tm_sec);
    
    ret = ioctl(fd, RTC_SET_TIME, &rtc);
    if (ret < 0) {
        return -1;
    }
    return 0;
    } 

     

     

    2.除了上面这种方式操作rtc时间以外,linux中也有一个命令可以简化rtc时间操作,hwclock,比如,可以通过system("hwclock -w");系统调用来把xtime设置到rtc硬件。

     

    墙上时间(realtime、xtime):

    linux系统中主要使用的就是xtime,它是系统运行的基础,很多程序都是依赖于xtime来运行的,接下来将介绍将如何操作xtime。

    1.获取、设置微秒级别的时间:

        #include <sys/time.h>
        #include <unistd.h>

          struct timeval
           {
                  inttv_sec;
                  inttv_usec;
           }; 

    int gettimeofday(struct timeval *tv, struct timezone *tz);
    int settimeofday(const struct timeval *tv, const struct timezone *gz);
    功能描述:

    gettimeofday()获取当前时间,有tv指向的结构体返回。

    settimeofday()把当前时间设成由tv指向的结构体数据。当前地区信息则设成tz指向的结构体数据。

     

    2.获取秒级别的时间

    typedef  long  time_t;

    time_ttime(time_t *t);

    如果tnon-null,它将会把时间值填入t

     

    3.内核2.6版本后新增的clock api接口

    获取纳秒级别的时间

     

    struct  timespec{ 

      time_t tv_sec; /*s*/  

      long tv_nsec; /*纳秒ns*/ 
    };

     

    int clock_getres(clockid_t clk_id , struct timespec *res);

    int clock_gettime(clockid_t clk_id , struct timespec *tp);

    int clock_settime(clockid_t clk_id 、 const struct timespec *tp);

    编译连接时采用-lrt才能编译通过。

    clk_id可选参数:

    CLOCK_REALTIME

    系统全局的实时时钟.设置此时钟需要合适的权限.

    CLOCK_MONOTONIC

    只能被读取,无法被设置,表示 monotonic 时间起点.

    CLOCK_PROCESS_CPUTIME_ID

    从 cpu 每进程的高分辨率计时器.

    CLOCK_THREAD_CPUTIME_ID

    线程的特定 cpu 时间时钟.

     

    系统启动时,会首先从rtc中读取rtc时间,并设置给xtime,而当ntp对系统时间进行更新时,首先设置xtime,然后调用hwclock设置到rtc硬件中。xtime根据需要的精度,可以通过上面几个接口来选择使用。

     

     

     

     

     

    展开全文
  • #include #include #include struct timeval tvpre, tvafter; gettimeofday(&tvpre, ... //这里是linux编程,这个sleep是为单位的 gettimeofday(&tvafter, NULL); ast_log(LOG_NOTICE,"prepaid_staff_log: test
  • Linux时间系统

    千次阅读 2013-06-25 19:13:21
    在网上看到介绍介绍linux时间系统的资料,绝对不错,有些地方写得比PLKA第15章还要好,转贴之。 原帖应该出自: http://blog.csdn.net/droidphone/article/details/7975694   1.  Linux时间系统之一:...
  • Linux有两个时间,一个是系统时间,一个是RTC时间(也叫硬件时间)。Linux系统启动时,会自动获取硬件时间,设置为系统时间。一、查询系统时间:查询系统时间:date查询/设置硬件时间: hwclock –r 显示硬件时钟...
  • Linux下查看系统信息方法总结

    千次阅读 2018-01-11 17:59:27
    Linux下如何查看系统启动时间运行时间 1.查看/proc/uptime文件计算系统启动时间: cat /proc/uptime 输出: 5113396.94 575949.85 第一数字即是系统运行时间5113396.94,运用系统工具date即可算出系统...
  • linux 统计 程序运行时间

    万次阅读 2011-08-29 16:48:33
    我们有时需要得到程序的运行时间,但我们也要知道,根本可能精确测量某一个程序运行的确切时间­[3],文献[4]中说的很明白,现摘录如下。  我们平时常用的测量运行时间的方法并不是那么精确的,换句话说,想精确...
  • linux 计算程序运行时间

    千次阅读 2017-02-10 14:02:14
    linux 计算程序运行时间 http://blog.sina.com.cn/s/blog_4b1849e4010115hb.html (2012-07-10 19:48:14) 转载▼ 标签: 转载 分类:linux 写的全面的一篇 还有一种 int getitimer(int which, struct ...
  • Linux系统优化基础和系统监控

    万次阅读 2017-09-26 20:01:11
    一些linux系统优化方法
  • Linux查看系统基本信息,版本信息(最全版)

    万次阅读 多人点赞 2018-10-18 15:04:29
    1.uname -a (Linux查看版本当前操作系统内核信息) 2.cat /proc/version (Linux查看当前操作系统版本信息) 3.cat /etc/issue 或cat /etc/redhat-release(Linux查看版本当前操作系统发行版信息) 4....
  • linux查看系统

    千次阅读 2021-01-20 22:52:16
    1.uname -a (Linux查看版本当前操作系统内核信息) 2.cat /proc/version (Linux查看当前操作系统版本信息) ...5.getconf LONG_BIT (Linux查看版本说明当前CPU运行在32bit模式下, 但代表CPU
  • Linux 内核时间管理

    2019-01-29 11:03:47
    时间管理在内核中占有非常重要的地位。...该中断就是所谓的定时器中断,它所对应的中断处理程序负责更新系统时间,还负责执行需要周期性运行的任务。系统定时器和时钟中断处理程序是Linux系统内核管...
  • Linux系统性能监控与调优

    万次阅读 2018-09-14 10:48:59
    QPS:query per second, 1内完成的请求 RT:response time, 1个请求完成的时间 Throughput越大,Latency会越差。因为请求量过大,系统太繁忙,所以响应速度自然会低 Latency越好,能支持的Throughput就会越高。...
  • Linux配置NTP时间同步

    万次阅读 多人点赞 2018-04-13 14:46:41
    检查系统是否安装了NTP包(linux系统一般自带NTP4.2),没有安装我们直接使用yum命令在线安装: yum install ntp2.NTP服务端配置文件编辑: vim /etc/ntp.conf结果:# @3新增-权限配置restrict 127.127.1.0restrict ...
  • Linux系统启动流程及系统裁剪

    万次阅读 多人点赞 2016-12-02 19:17:17
    Linux系统启动流程,Linux系统裁剪
  • linux时间同步

    千次阅读 2012-10-10 17:17:14
    linux时间同步,ntpd、ntpdate  在Windwos中,系统时间的设置很简单,界面操作,通俗易懂。而且设置后,重启,关机都没关系。系统时间会自动保存在Bios的...在Linux运行过程中,系统时间和硬件时间以异步的方式运行
  • Linux 日志系统

    千次阅读 2018-09-06 22:08:50
    可以使用日志系统所记录的信息为系统进行排错,优化系统的性能,或者根据这些信息调整系统的行为。收集你想要的数据,分析出有价值的信息,可以提高系统、产品的安全性,还可以帮助开发完善代码,优化产品。日志会...
  • 查看和修改Linux时间 时钟--详解 硬件时钟 系统时钟 时间同步 时间标准 网络时间 ntp时钟同步服务 chrony时钟同步服务 备注 ntp常用服务器 基础认识 操作系统时间(时钟)由以下4个部分决定:...
  • linux系统常用的20个命令(适合新手练习)

    万次阅读 多人点赞 2019-07-30 09:49:52
    **linux系统常用的20个命令(适合新手)** 1.ls命令 功能:Linux系统中,ls命令只要用于查看指定工作目录的内容,列出指定目录下所含有的文件以及子目录; 实列:a.列出/mnt目录下的文件及其子目录: b.“ls –l”...
  • linux查询系统版本

    千次阅读 2021-01-20 23:22:45
    1.uname -a (Linux查看版本当前操作系统内核信息) 2.cat /proc/version (Linux查看当前操作系统版本信息) ...5.getconf LONG_BIT (Linux查看版本说明当前CPU运行在32bit模式下, 但代表CPU
  • Linux之日志系统

    千次阅读 2016-12-09 12:08:36
    我们可以使用日志系统所记录的信息为系统进行排错,优化系统的性能,或者根据这些信息调整系统的行为。收集你想要的数据,分析出有价值的信息,可以提高系统、产品的安全性,可以帮助开发完善代码,优化产品。日志会...
  • linux常用系统调用简介

    千次阅读 2014-11-21 10:39:54
    linux常用系统调用手册 本篇文章值说明有关函数的
  • LINUX时间管理

    万次阅读 2012-06-08 00:28:15
    内核必须管理系统运行时间以及当前的日期和时间。 首先搞清楚RTC在kernel内的作用: linux系统有两个时钟:实时时钟和系统定时器 实时时钟  一个是由纽扣电池供电的“Real Time Clock”也叫做RTC...
  • linux系统深入学习

    千次阅读 2016-06-02 13:06:25
    这里用到的软件是VMware,是一种虚拟化的技术,其实一台计算机就是一台虚拟机,操作系统本身也就是虚拟化的技术,像CPU只有一颗,在某一时刻跟人一样只能想一件事情,只能运行一个程序,但是为什么现在可以同时运行...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 64,327
精华内容 25,730
关键字:

linux不依赖系统时间运行秒数

linux 订阅