热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Linux系统调优初阶

L

点击上方“icloud布道师”,“星标或置顶公众号”

逆境前行,能帮你的只有自己


************************************


春风她吻上我的脸
      告诉我现在是春天
            春天里处处花争艳
                    别让那花谢一年又一年




             本文制作需要3小时,阅读需要5分钟



系统调优概述



系统调优

     1.系统的运行状况: CPU -> MEM -> DISK*-> NETWORK -> 应用程序调优

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

     3. 调优(把错误的调正确)


性能优化:

     指的找打系统中的瓶颈并去除这些瓶颈

     性能优化其实是对OS 各子系统达到一种平衡的定义,这些子系统包括了: 

      

这些子系统都是相互关联的,任何一个出现高负载都会产生影响

比如:

大量的网页调入请求导致内存队列的拥塞;

 网卡的大吞吐量可能导致更多的 CPU 开销;

 大量的 CPU 开销又会尝试更多的内存使用请求;

 大量来自内存的磁盘写请求可能导致更多的 CPU 以及 IO 问题;

 所以要对一个系统进行优化,查找瓶颈来自哪个方面是关键,虽然看似是某一个子系统出现问题,其实有 可能是别的子系统导致的.



调优就像医生看病,因此需要你对服务器所有地方都了解清楚。

当系统出了问题,运行卡,如何快速找出以下进程:

 1、找出系统中使用CPU最多的进程? 

2、找出系统中使用内存最多的进程?

 3、找出系统中对磁盘读写最多的进程? 

4、找出系统中使用网络最多的进程?







查看CPU负载相关工具



查看CPU负载

uptime

    [root@bogon ~]# uptime
     17:09:27    //系统时间
     up 2 days,  //运行时间
     4 users,     //登录用户
     load average: 0.00, 0.02, 0.33  // 系统负载,即任务队列的平均长度。三个数值分别为 1分 钟、5分钟、15分钟前到现在的平均值。


    例1:找出前当系统中,CPU负载过高的服务器?

     服务器1: load average: 0.15, 0.08, 0.01 1核 

    服务器2: load average: 4.15, 6.08, 6.01 1核

    服务器3: load average: 10.15, 10.08, 10.01 4核 

    答案:服务器2 如果服务器的CPU为1核心,则load average中的数字 >=3 负载过高,如果服务器的CPU为 4核心,则load average中的数字 >=12 负载过高。


    经验:单核心,1分钟的系统平均负载不要超过3,就可以,这是个经验值。



    查看使用CPU情况

    top

    top 显示出现的每个列的含义分别为:

    PID:   进程描述符 
    USER: 
    进程的拥有者 
    PR:
    进程的优先级 
    NI: 
    nice level 
    SIZE:
     进程拥有的内存(包括code segment + data segment + stack segment) 
    RSS: 
    物理内存使用
    VIRT(virtul memory usage):
    进程需要的虚拟内存大小
    RES(resident memory usage):
    常驻内存 
    SHARE:
    和其他进程共享的物理内存空间 
    STAT:
    进程的状态,有 S=sleeping,R=running,T=stopped or traced,D=interruptible sleep(不可中断的睡眠状态),Z=zombie。 
    %CPU:
    CPU使用率 
    %MEM:
    物理内存的使用
    TIME: 
    进程占用的总共cpu时间 
    COMMAND:
    进程的命令


      &&  `top命令参数`


      f : 选择显示或隐藏对应的列的内容,进入后按a-z即可显示或隐藏
      o: 可以改变列的显示顺序,进入后按小写的 a-z 可以将相应的列向右移动,而大写的 A-Z 可以将相应的列向左移动。最后按回车键确定。
      F或O: 进入后按a-z可以将进程按照相应的列进行排序,选定排序列按回车键退出之后还可以按R对当前选定列进行排序倒转。
      k : 终止一个进程。系统将提示用户输入需要终止的进程PID,以及需要发送给该进程什么样的信号。一般的终止进程可以使用15信号;如果不能正常结束那就使用信号9强制结束该进程。默认值是信号15。在安全模式中此命令被屏蔽
      i: 忽略闲置和僵死进程。这是一个开关式命令
      q: 退出程序
      S: 切换到累计模式。
      s : 改变两次刷新之间的延迟时间。系统将提示用户输入新的时间,单位为s。如果有小数,就换算成ms。输入0值则系统将不断刷新,默认值是5 s。需要注意的是如果设置太小的时间,很可能会引起不断刷新,从而根本来不及看清显示的情况,而且系统负载也会大大增加
      r: 重新安排一个进程的优先级别。系统提示用户输入需要改变的进程PID以及需要设置的进程优先级值。输入一个正值将使优先级降低,反之则可以使该进程拥有更高的优先权。默认值是10。
      l:  切换显示平均负载和启动时间信息。即显示影藏第一行
      m: 切换显示内存信息。即显示影藏内存行
      t : 切换显示进程和CPU状态信息。即显示影藏CPU行
      c: 切换显示命令名称和完整命令行。 显示完整的命令。 这个功能很有用。
      M : 根据驻留内存大小进行排序。
      P: 根据CPU使用百分比大小进行排序。
      T: 根据时间/累计时间进行排序。
      W: 将当前设置写入~/.toprc文件中。这是写top配置文件的推荐方法


      h或者? 显示帮助画面,给出一些简短的命令总结说明
      ---------------------
      作者:weixin_42500678
      来源:CSDN
      原文:https://blog.csdn.net/weixin_42500678/article/details/80754737 


      cat proc/cpuinfo

        [root@bogon ~]# cat proc/cpuinfo
        processor  : 0 #系统中逻辑处理核的编号,逻辑CPU个数 1个
        vendor_id : GenuineIntel #CPU制造商 因特尔”原厂
        cpu family : 6 #CPU产品系列代号
        model : 158 #CPU属于其系列中的哪一代的代号
        model name : Intel(R) Core(TM) i5-7400 CPU @ 3.00GHz #CPU属于的名字及其编号、标称主频
        stepping : 9 # CPU属于制作更新版本
        microcode : 0x84
        cpu MHz : 2999.995 #CPU的实际使用主频
        cache size : 6144 KB #CPU二级缓存大小
        physical id  : 0                       #单个CPU的标号
        siblings  : 2                          #单个CPU逻辑物理核数
        core id    : 0                         #当前物理核在其所处CPU中的编号,这个编号不一定连续  
        cpu cores  : 2                         #该逻辑核所处CPU的物理核数
        apicid    : 0                          #用来区分不同逻辑核的编号,系统中每个逻辑核的此编号必然不同,此编号不一定连续
        initial apicid : 0
        fpu : yes
        fpu_exception : yes
        cpuid level : 22
        wp : yes
        flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxr sse sse2 ss ht syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon nopl xtopology tsc_reliable nonsop_tsc eagerfpu pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer as xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch ibrs ibpb stibp fsgsbase tsc_adjust bmi1 av2 smep bmi2 invpcid mpx rdseed adx smap clflushopt xsaveopt xsavec arat spec_ctrl intel_stibp arch_capablities
        bogomips : 5999.99
        clflush size : 64
        cache_alignment : 64
        address sizes : 43 bits physical, 48 bits virtual
        power management:


        processor : 1
        vendor_id : GenuineIntel
        cpu family : 6
        model : 158
        model name : Intel(R) Core(TM) i5-7400 CPU @ 3.00GHz
        stepping : 9
        microcode : 0x84
        cpu MHz : 2999.995
        cache size : 6144 KB
        physical id : 0
        siblings : 2
        core id : 1
        cpu cores : 2
        apicid : 1
        initial apicid : 1
        fpu : yes
        fpu_exception : yes
        cpuid level : 22
        wp : yes
        flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxr sse sse2 ss ht syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon nopl xtopology tsc_reliable nonsop_tsc eagerfpu pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer as xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch ibrs ibpb stibp fsgsbase tsc_adjust bmi1 av2 smep bmi2 invpcid mpx rdseed adx smap clflushopt xsaveopt xsavec arat spec_ctrl intel_stibp arch_capablities
        bogomips : 5999.99
        clflush size : 64
        cache_alignment : 64
        address sizes : 43 bits physical, 48 bits virtual
        power management:



        ps -aux




        扩展:孤儿进程与僵尸进程

        概念

         在unix/linux中,正常情况下,子进程是通过父进程创建的,子进程在创建新的进程。子进程的结束和父进程的运行是一个异步过程,即父进程永远无法预测子进程 到底什么时候结束。 当一个 进程完成它的工作终止之后,它的父进程需要调用wait()或者waitpid()系统调用取得子进程的终止状态。

         孤儿进程:一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作。

          僵尸进程:一个进程使用fork创建子进程,如果子进程退出,而父进程并没有调用wait或waitpid获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中。这种进程称之为僵死进程。


        危害

         孤儿进程是没有父进程的进程,孤儿进程这个重任就落到了init进程身上,init进程就好像是一个民政局,专门负责处理孤儿进程的善后工作。每当出现一个孤儿进程的时候,内核就把孤 儿进程的父进程设置为init,而init进程会循环地wait()它的已经退出的子进程。这样,当一个孤儿进程凄凉地结束了其生命周期的时候,init进程就会代表党和政府出面处理它的一切善后工作。因此孤儿进程并不会有什么危害。


        如果进程不调用wait waitpid的话, 那么保留的那段信息就不会释放,其进程号就会一直被占用,但是系统所能使用的进程号是有限的,如果大量的产生僵死进程,将因为没有可用的进程号而导致系统不能产生新的进程. 此即为僵尸进程的危害,应当避免。







        查看MEMORY运行工具



        查看内存使用情况

        free -m

          && `注解 `
          -----Mem:    物理内存
              -total    容量总数 
          -used 已使用容量
          -free 空余容量
          -shared buffers 缓冲,通常缓冲元数据
          -cached            缓存,通常缓存数据
          ------Swap:        交换空间 2047 容量总数 0 已使用容量 2047 空余容量
          -buffers  缓存从磁盘读出的内容 
               -cached       缓存需要写入磁盘的内容 当物理内存不够用的时候,内核会把非活跃的数据清空。


          cat proc/meminfo

            [root@bogon ~]# cat proc/meminfo
            MemTotal: 995924 kB
            MemFree: 79608 kB
            MemAvailable: 73316 kB
            Buffers: 36 kB
            Cached: 105536 kB
            SwapCached: 131808 kB
            Active: 227348 kB #活跃内存,指进程一直读写的内存空间
            Inactive:         387412 kB          # 非活跃内存   //注:当内存不够用时,kernel总是把不活跃的内存交换到swap空间。如果inactive内存多时,加 swap空间可以解决问题,而active多,则考虑加内存



            按照内存使用大小排序进程

              [root@bogon ~]# ps aux --sort rss
              USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
              root 2 0.0 0.0 0 0 ? S 6月12 0:00 [kthreadd]
              root 3 0.1 0.0 0 0 ? S 6月12 4:00 [ksoftirqd/0]
              root 5 0.0 0.0 0 0 ? S<6月12 0:00 [kworker/0:0H]
              root 7 0.0 0.0 0 0 ? S 6月12 0:35 [migration/0]
              root 8 0.0 0.0 0 0 ? S 6月12 0:00 [rcu_bh]
              root 9 0.6 0.0 0 0 ? R 6月12 20:29 [rcu_sched]
              root         10  0.0  0.0      0     0 ?        S<   6月12   0:00 [lru-add-drain]







              查看IO相关工具


              IO调优相关查看工具

              查看系统块大小

                [root@bogon ~]#  xfs_growfs -l /dev/sda1 


                iotop

                  && `查看使用过高io的进程`
                  [root@bogon ~]# yum install iotop -y
                  [root@bogon ~]# iotop 


                   
                  选项:
                  -o:只显示有io操作的进程
                  -b:批量显示,无交互,主要用作记录到文件。
                  -n NUM:显示NUM次,主要用于非交互式模式。
                  -d SEC:间隔SEC秒显示一次。
                  -p PID:监控的进程pid。
                  -u USER:监控的进程用户




                  iotop常用快捷键:
                  <- ->:左右箭头:改变排序方式,默认是按IO排序。
                  r:改变排序顺序。
                  o:只显示有IO输出的进程。
                  p:进程/线程的显示方式的切换。
                  a:显示累积使用量。
                  q:退出



                  iostat

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


                    && `查看`
                    [root@bogon ~]# iostat -d -p -k dev/sda
                    Linux 3.10.0-957.el7.x86_64 (bogon) 20190614日 _x86_64_ (2 CPU)


                    Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
                    sda 4.84 236.62 28.44 46236560 5557075
                    sda1 0.01 0.06 0.01 12338 2126
                    sda2 4.82 236.54 28.43 46222294 5554949
                    sdb 0.00 0.05 0.00 9000 0
                    sdb2 0.00 0.02 0.00 2976 0
                    sdb3 0.00 0.02 0.00 2960 0
                    sdc 0.00 0.02 0.00 3076 0
                    scd0 0.00 0.01 0.00 1050 0
                    dm-0 4.55 230.65 18.74 45070606 3661057
                    dm-1              3.89         5.88         9.69    1149560    1893892


                    注: 每列含意:
                    - kB_read/s 每秒从磁盘读入的数据量,单位为K.
                    - kB_wrtn/s 每秒向磁盘写入的数据量,单位为K.
                    - kB_read 读入的数据总量,单位为K.
                    - kB_wrtn 写入的数据总量,单位为K.



                      && `测试`
                      [root@bogon ~]# dd if=/dev/zero of=test.xxx bs=10M count=1000;sync
                      [root@bogon ~]# iostat -d -p -k dev/sda
                      然后查看变化







                      查看NETWORK相关工具



                      NETWORK相关查看工具

                      netstat

                        [root@localhost ~]# netstat -tlunp
                        Active Internet connections (only servers)
                        Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
                        tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN 1342/php-fpm: maste
                        tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 1861/mysqld
                        tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 1/systemd
                        tcp 0 0 0.0.0.0:45043 0.0.0.0:* LISTEN 16719/rpc.statd
                        tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1345/sshd
                        tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 2044/master
                        tcp6 0 0 :::111 :::* LISTEN 1/systemd
                        tcp6 0 0 :::80 :::* LISTEN 6491/httpd
                        tcp6 0 0 :::22 :::* LISTEN 1345/sshd
                        tcp6 0 0 ::1:25 :::* LISTEN 2044/master
                        tcp6 0 0 :::50304 :::* LISTEN 16719/rpc.statd
                        udp 0 0 0.0.0.0:743 0.0.0.0:* 16680/rpcbind
                        udp 0 0 127.0.0.1:783 0.0.0.0:* 16719/rpc.statd
                        udp 0 0 0.0.0.0:111 0.0.0.0:* 1/systemd
                        udp 0 0 0.0.0.0:40065 0.0.0.0:* 16719/rpc.statd
                        udp6 0 0 :::32967 :::* 16719/rpc.statd
                        udp6 0 0 :::743 :::* 16680/rpcbind



                        nload

                          [root@localhost ~]# yum install nload

                            在另一台xshell上输入安装命令,再查看
                            [root@localhost ~]# yum  install rsync

                             


                            nethogs

                              相当于windows的360监控图
                              [root@localhost ~]# yum install nethogs


                              在另一端产生数据
                              wget http://issuecdn.xxxxxxxxxxxxxxxxxxxxxxx








                              查看系统整体状况


                              VMSTAT

                              vmstat
                              命令是最常见的Linux/Unix监控工具,可以展现给定时间间隔的服务器的状态值,包括 服务器的CPU使用率,MEM内存使用,VMSwap虚拟内存交换情况,IO读写情况。 使用vmstat可以看到整个机器的CPU,内存,IO的使用情况,而不是单单看到各个进程的CPU使 用率和内存使用率。 比top命令节省资源。

                               注:当机器运行比较慢时,建议大家使用vmstat查看运行状态,不需要使用top,因top使用资源 比较多。


                                [root@localhost ~]# vmstat
                                procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
                                r b swpd free buff cache si so bi bo in cs us sy id wa st
                                 2  0  95848  89344    124 424508    0    0     0     1    1    1  1  0 99  0  0


                                  每一列参数作用:


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










                                  推荐阅读
                                  • 本文详细介绍了在PHP中如何获取和处理HTTP头部信息,包括通过cURL获取请求头信息、使用header函数发送响应头以及获取客户端HTTP头部的方法。同时,还探讨了PHP中$_SERVER变量的使用,以获取客户端和服务器的相关信息。 ... [详细]
                                  • 本文详细介绍了Socket在Linux内核中的实现机制,包括基本的Socket结构、协议操作集以及不同协议下的具体实现。通过这些内容,读者可以更好地理解Socket的工作原理。 ... [详细]
                                  • 本文介绍了ADO.NET框架中的五个关键组件:Connection、Command、DataAdapter、DataSet和DataReader。每个组件都在数据访问和处理过程中扮演着不可或缺的角色。 ... [详细]
                                  • 本文详细介绍了如何搭建一个高可用的MongoDB集群,包括环境准备、用户配置、目录创建、MongoDB安装、配置文件设置、集群组件部署等步骤。特别关注分片、读写分离及负载均衡的实现。 ... [详细]
                                  • 本文将深入探讨 Unreal Engine 4 (UE4) 中的距离场技术,包括其原理、实现细节以及在渲染中的应用。距离场技术在现代游戏引擎中用于提高光照和阴影的效果,尤其是在处理复杂几何形状时。文章将结合具体代码示例,帮助读者更好地理解和应用这一技术。 ... [详细]
                                  • RTThread线程间通信
                                    线程中通信在裸机编程中,经常会使用全局变量进行功能间的通信,如某些功能可能由于一些操作而改变全局变量的值,另一个功能对此全局变量进行读取& ... [详细]
                                  • Excel技巧:单元格中显示公式而非结果的解决方法
                                    本文探讨了在Excel中如何通过简单的方法解决单元格显示公式而非计算结果的问题,包括使用快捷键和调整单元格格式两种方法。 ... [详细]
                                  • 汇总了2023年7月7日最新的网络安全新闻和技术更新,包括最新的漏洞披露、工具发布及安全事件。 ... [详细]
                                  • Canopy环境安装与使用指南
                                    《利用Python进行数据分析》一书推荐使用EPDFree版本的环境,然而随着技术的发展,目前更多人倾向于使用Canopy。本文将详细介绍Canopy的安装及使用方法。 ... [详细]
                                  • 2019年独角兽企业招聘Python工程师标准课程概览
                                    本文详细介绍了2019年独角兽企业在招聘Python工程师时的标准课程内容,包括Shell脚本中的逻辑判断、文件属性判断、if语句的特殊用法及case语句的应用。 ... [详细]
                                  • 解析Java虚拟机HotSpot中的GC算法实现
                                    本文探讨了Java虚拟机(JVM)中HotSpot实现的垃圾回收(GC)算法,重点介绍了根节点枚举、安全点及安全区域的概念和技术细节,以及这些机制如何影响GC的效率和准确性。 ... [详细]
                                  • 本文探讨了异步编程的发展历程,从最初的AJAX异步回调到现代的Promise、Generator+Co以及Async/Await等技术。文章详细分析了Promise的工作原理及其源码实现,帮助开发者更好地理解和使用这一重要工具。 ... [详细]
                                  • 流处理中的计数挑战与解决方案
                                    本文探讨了在流处理中进行计数的各种技术和挑战,并基于作者在2016年圣何塞举行的Hadoop World大会上的演讲进行了深入分析。文章不仅介绍了传统批处理和Lambda架构的局限性,还详细探讨了流处理架构的优势及其在现代大数据应用中的重要作用。 ... [详细]
                                  • C# 中创建和执行存储过程的方法
                                    本文详细介绍了如何使用 C# 创建和调用 SQL Server 存储过程,包括连接数据库、定义命令类型、设置参数等步骤。 ... [详细]
                                  • Redis:缓存与内存数据库详解
                                    本文介绍了数据库的基本分类,重点探讨了关系型与非关系型数据库的区别,并详细解析了Redis作为非关系型数据库的特点、工作模式、优点及持久化机制。 ... [详细]
                                  author-avatar
                                  goxtop
                                  这个家伙很懒,什么也没留下!
                                  PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
                                  Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有