linux系统调优

CPU 资源的调优
    调整nice值改变进程优先级
    1.nice 概述:在 LINUX 系统中,Nice 值的范围从-20 到+19(不同系统的值范围是不一样的),正值表示低优先级,负值表示高优先级,值为零则表示不会调整该进程的优先级。具有最高优先级的程序,
其 nice 值最低,所以在 LINUX 系统中,值-20 使得一项任务变得非常重要;与之相反,如果任务的 nice为+19,则表示它是一个高尚的、无私的任务,允许所有其他任务比自己享有宝贵的 CPU 时间的更大使用份额,这也就是 nice 的名称的来意。默认优先级是 0
    2.在命令运行前,调整进程 nice 值,让进程使用更多的 CPU
    nice -n 优先级数字 命令
    nice -n -5 vim a.txt
    top -p PID
    3.使用 renice 修改正在运行的进程的优先级
    renice -n 5 PID #修改进程优先级
    renice -n 6 PID
    进程优先级不可以超过 -20 到 19 范围
    4.设 置 进 程 的 CPU 亲 和 力
    taskset 作用:在多核的情况下,可以认为指定一个进程在哪颗 CPU 上执行程序,减少进程在不同CPU 之前切换的开销。
    yum install util-linux
    taskset 语法: taskset -cp [CPU ID 号] 命令或进程 ID
    -p, --pid 在已经存在的 pid 上操作
    -c, --cpu-list 以列表格式显示和指定 CPU
    taskset -c 0 vim a.txt #第一个 CPU 的 ID 是 0
    ps -axu | grep vim    --->   taskset -cp PID

使 用 vmstat 找 出 系 统 中 存 在 瓶 颈
    1、CPU 利用率比例分配:
    如果一个 CPU 被充分使用,利用率分类之间均衡的比例应该是。
    65% ­ 70% User Time #用户态(通常指我们运行的服务和程序)。
    30% ­ 35% System Time #内核态。
    0% ­ 5% Idle Time #空闲
    Context Switches ­ 上下文切换的数目直接关系到 CPU 的使用率,如果 CPU 利用率保持在上述均衡状态时,有大量的上下文切换是正常的
    上下文切换指的就是 cpu 中寄存器数据的写入和读出。每个进程在使用 cpu 时,都需要把自己的数据先写入 cpu 的缓存(寄存器)中,然后 cpu 才能根据缓存中的数据来计算
    1、Procs(进程):
    r: The number of processes waiting for run time.
    等待运行的进程数。如果等待运行的进程数越多,意味着 CPU 非常繁忙。另外,如果该参数长期大于 cpu 核心数 3 倍,说明 CPU 资源可能存在较大的瓶颈。
    b: The number of processes in uninterruptible sleep.
    处在非中断睡眠状态的进程数。即等待 IO 的进程数量。
    2、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
    3、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,表示物理内存不够用或者内存泄露了。
    内存够用的时候,这 2 个值都是 0,如果这 2 个值长期大于 0 时,系统性能会受到影响,磁盘 IO和 CPU 资源都会被消耗
    当看到空闲内存(free)很少的或接近于 0 时,就认为内存不够用了,这个是不正确的。不能光看这一点,还要结合 si 和 so。如果 free 很少,但是 si 和 so 是 0,那么不用担心,系统性能这时不会受到影响的
    4、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 通常是写磁盘的数据
    5、System(系统)
    in: The number of interrupts per second, including the clock.
    每秒的中断数,包括时钟中断。
    cs: The number of context switches per second.
    每秒的环境(上下文)切换次数。比如我们调用系统函数,就要进行上下文切换,而过多的上下文切换会浪费较多的 cpu 资源,这个数值应该越小越好
    6、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 运行时间的百分比
    

 

有关磁盘 I/O 的调优
    ulimit 资 源 限 制
    限制用户资源配置文件:/etc/security/limits.conf
    每行的格式:用户名/@用户组名 类型(软限制/硬限制) 选项 值
    * soft nofile 1024000
    * hard nofile 1024000
    soft 是一个警告值,而 hard 则是一个真正意义的阀值,超过就会报错。一般把 soft 和 hard 都配置成一样的值。 最大打开的文件数以文件描叙符 file descripter 计数)
     ulimit -n #查看一个进程可以打开的文件数
    reboot重启后,/etc/security/limits.conf配置生效
    ulimit -n 10000   #临时修改,不需重启

    nproc #配置一个用户可以打开的最大进程数
     vim /etc/security/limits.d/20-nproc.conf
    * soft nproc 65535
    * hard nproc 65535
    ulimit -u  6553  #临时修改
    查 看 所 有 的 资 源 限 制 信 息
    ulimit -a

 

测 试 硬 盘 速 度
    一般情况下使用 hdparm 来测试磁盘顺序读的速度。dd 命令用来测试磁盘顺序写的速度
    1、hdparm 命令常用参数
参数:
-t perform device read timings #不使用预先的数据缓冲, 标示了 Linux 下没有任何文件系统开销时磁盘可以支持多快的连续数据读取. perform [pəˈfɔ:m] #执行
    --direct Use O_DIRECT to bypass page cache for timings #直接绕过缓存进行统计数据
    2、测试硬盘读速度
    hdparm -t --direct /dev/sda
    3、使用 dd 命令测试磁盘 IO 的顺序写和读速度
    在使用前首先了解两个特殊设备:/dev/null 伪设备,回收站.写该文件不会产生 IO 开销;/dev/zero 伪设备,会产生空字符流,读该文件不会产生 IO 开销
    4、使用 dd 测试磁盘的 IO 顺序写速度
     dd if=/dev/zero of=/test.dbf bs=1M count=2000 oflag=direct,nonblock

  

系统内核相关参数调优
    SYN攻击是利用TCP/IP协议3次握手的原理,发送大量的建立连接的网络包,但不实际建立连接,最终导致被攻击服务器的网络队列被占满,无法被正常用户访问
    vim /etc/sysctl.conf #在文件最后添加以下内容
    net.ipv4.tcp_synack_retries = 1  内核放弃TCP 链接之前向客户端发送SYN+ACK 包的数量,一般赋值为1,即内核放弃链接之前发送一次SYN+ACK 包 
    net.ipv4.tcp_syn_retries = 1 该参数的作用与上一个参数类似,设置内核放弃建立链接之前发送SYN包的数量
    net.ipv4.tcp_max_syn_backlog = 20480 SYN队列长度
    net.ipv4.tcp_syncookies = 1 开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理
    net.ipv4.tcp_tw_reuse = 1    打开系统的TIMEWAIT重用
    net.ipv4.tcp_tw_recycle = 1  打开系统的TIMEWAIT快速回收
    net.ipv4.tcp_fin_timeout = 10 套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间
    fs.file-max = 819200 系统所有进程一共可以打开的文件数量
    net.core.somaxconn = 65535 最多允许在多少TCP套接字不被关联到任何一个用户文件句柄上。如果超过这个数字,没有与用户文件句柄关联的TCP 套接字将立即被复位,同时给出警告信息。这个限制只是为了防止简单点的Dos 攻击
    net.core.rmem_max = 1024123000 接收套接字缓冲区大小的最大值
    net.core.wmem_max = 16777216  发送套接字缓冲区大小的最大值
    net.core.netdev_max_backlog = 165536 每个网络接口 接受数据包的速率比内核处理这些包的速率快时,允许发送到队列的数据包的最大数目
    net.ipv4.ip_local_port_range = 10000 65535 允许系统打开的端口范围
    注:每台服务器上线之前,都应该配置以上内核参数

    cat /proc/sys/net/ipv4/tcp_synack_retries #最关键参数,默认为5,修改为0 表示不要重发
    net.ipv4.tcp_synack_retries = 0
    #表示回应第二个握手包(SYN+ACK包)给客户端IP后,如果收不到第三次握手包(ACK包)后,不进行重试,加快回收“半连接”,不要耗光资源
    #作为服务端。回应时,如果连接失败,达到对应的失败数后,停止发送synack包
    不修改这个参数,模拟攻击,10秒后被攻击的80端口即无法服务,机器难以ssh登录; 用命令netstat -na |grep SYN_RECV检测“半连接”hold住180秒
    
    cat /proc/sys/net/ipv4/tcp_syn_retries
    #tcp_syn_retries参数,默认是5,当没有收到服务器端的SYN+ACK包时,客户端重发SYN握手包的次数。
    
    cat /proc/sys/net/ipv4/tcp_max_syn_backlog
    半连接队列长度,增加SYN队列长度到2048:加大SYN队列长度可以容纳更多等待连接的网络连接数,具体多少数值受限于内存

    #系统允许的文件句柄的最大数目,因为连接需要占用文件
    fs.file-max = 819200
    #用来应对突发的大并发connect 请求
    net.core.somaxconn = 65535 #最大的TCP 数据接收缓冲(字节)
    net.core.rmem_max = 1024123000
    #最大的TCP 数据发送缓冲(字节)
    net.core.wmem_max = 16777216
    #网络设备接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目
    net.core.netdev_max_backlog = 165536
    #本机主动连接其他机器时的端口分配范围,比如说,在vsftpd主动模式会用到
    net.ipv4.ip_local_port_range = 10000 65535
    
    次 要 辅 助 参 数
    以上还无法解决syn洪水攻击,把以下内核参数关闭:
    注意,以下参数面对外网时,不要打开。因为副作用很明显。 #当出现 半连接 队列溢出时向对方发送syncookies,调大 半连接 队列后没必要
    net.ipv4.tcp_syncookies = 0
    #表示开启重用,允许TIME-wAIT sockets重新用于新的TCP链接,默认值为0,表示关闭,该参数对应系统路径为:/proc/sys/net/ipv4/tcp_tw_reuse 0
    net.ipv4.tcp_tw_reuse = 1
# 表示开启TCP链接中TIME_WAIT sockets的快速回收,该参数对应系统路径为:/proc/sys/net/ipv4/tcp_tw_recycle,默认为0 表示关闭,不建议开启,因为nat网络问题
net.ipv4.tcp_tw_recycle = 0
# reuse和recycle这俩个参数是为防止生产环境下web,squid等业务服务器time_wait网络状态数量过多设置的
   # 表示开启SYN Cookies功能,当出现SYN等待队列溢出时,启用Cookies来处理,可防范少量SYN攻击,该参数对应系统路径为:/proc/sys/net/ipv4/tcp_syscookies,默认为1,表示开启
net.ipv4.tcp_syncookies = 1 #时间戳选项,与前面net.ipv4.tcp_tw_reuse参数配合 net.ipv4.tcp_timestamps = 0 #TIME_WAIT状态的连接回收功能 net.ipv4.tcp_tw_recycle = 0 #表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭 #表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭,现在开启,改为1 #表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭。现在改为1,表示开启 #默认值是 60,对于本端断开的socket连接,TCP保持在FIN_WAIT_2状态的时间
  # 表示当keepalive启用时,TCP发送keepalive消息的频度,默认是2小时,建议更改为10分钟,该参数对应系统路径为:/proc/sys/net/ipv4/tcp_keepalive_time,默认为7200秒
net.ipv4.tcp_keepalive_time =600
  # 该选项用来设定允许系统打开的端口范围,即用于向外链接的端口范围,该参数对应系统路径为:/proc/sys/net/ipv4/ip_local_port_range 默认,32768 60999
  net.ipv4.ip_local_port_range = 32768 60999

  

 

 

posted @ 2020-04-16 17:30  MlxgzZ  阅读(333)  评论(0编辑  收藏  举报