• 基础


    HTTP/1.1中定义了5类状态码, 状态码由三位数字组成,第一个数字定义了响应的类别
     1XX  提示信息 - 表示请求已被成功接收,继续处理
     2XX  成功 - 表示请求已被成功接收,理解,接受
     3XX  重定向 - 要完成请求必须进行更进一步的处理
     4XX  客户端错误 -  请求有语法错误或请求无法实现
     5XX  服务器端错误 -   服务器未能实现合法的请求

    看看一些常见的状态码
    200 OK  最常见的就是成功响应状态码200了, 这表明该请求被成功地完成,所请求的资源发送回客户端
    302 Found 重定向,新的URL会在response 中的Location中返回,浏览器将会自动使用新的URL发出新的Request
    304 Not Modified 代表上次的文档已经被缓存了, 还可以继续使用
    400 Bad Request   客户端请求与语法错误,不能被服务器所理解
    403 Forbidden  服务器收到请求,但是拒绝提供服务
    404 Not Found 请求资源不存在(输错了URL)
    500 Internal Server Error  服务器发生了不可预期的错误
    503 Server Unavailable  服务器当前不能处理客户端的请求,一段时间后可能恢复正常

    1、线上查询及帮助命令(1个):help
           help:获取某个命令的帮助信息。格式:命令 --help

    2、文件和目录操作命令(12个):ls reepwdmkdir mdircd ouchcpmv mlnfind
           ls:列出当前目录下的所有文件和文件夹。常用参数:-l  除文件外,也将文件型态、权限、拥有者、文件大小等详细列出。
           tree:以树状图列出目录中的内容。
           pwd:显示当前目录的路径。
           mkdir:在当前目录下创建子目录。常用参数:-p   确保目录存在,不存在则创建,创建多级目录时会用到。
           rmdir:删除空的目录。常用参数:-p  删除子目录后父目录为空时,父目录也会被删除,删除多级目录时会用到。
           cd:切换目录。目录省略时,切换到当前登录者的home目录,与“~”的效果一样;“..”表示切换到上级目录;“.”表示当前目录;“-”表示切换到上次使用的目录。
           touch:创建文本。文件存在时,会将文件的时间属性修改为当前时间。
           cp:复制文件或目录到新目录中。常用参数:-a  复制目录时保留目录链接、属性及复制目录中所有内容;-r  复制目录时需要用到;-f  新目录中存在相同内容时直接覆盖不提示;-i  有相同内容时会先提示。
           mv:移动文件或目录到新目录中,或者修改文件名。常用参数:-f   -i  作用与cp的参数作用相同。修改文件名的用法:mv  文件名    新文件名      
           rm:删除文件或目录。常用参数:-f   -i   作用与cp的参数作用相同。-r   将目录及里面的内容逐一删除,删除目录时需要配合使用。
           ln:为一个文件或目录在另外一个地方建立链接。-f:强制执行;-i:给出提示信息;-s:建立软链接;-b:覆盖以前建立的链接。
           find:在指定目录下查找文件。不指定路径时,默认在当前目录下查找。常用参数:-mount  只同一文件系统下查找;-amin  n  n分钟内读取过;-atime   n   n天内读取过;-cmin  n  n分钟内修改过;-ctime   n  n天内修改过;-size  n  文件的大小为n单位;-type  c   类型为c的文件(c的取值:d  目录;f   一般文件;l  链接)。

    3、查看文件及内容处理命令(21个):catmorelesshead ailgrepfile等
           cat:查看文件内容。常用参数:-n  从1开始对所有输出行编号;-s  连续两行以上为空白替换为一行空白。
           more:分页显示内容。常用参数:-num  一次显示的行数;-s  连续两行以上为空白替换为一行空白;+num  从num行开始显示。操作:按Space键向下翻页,按B键向上翻页。
           less:与more的作用相同,但是操作更灵活。常用参数:-N显示行号;-s连续两行以上的空白替换为一行空白。操作:b  向后翻一页;d   向前翻一页;上下键    滚动一行;Q键   退出less命令。
           head:显示文件前面的内容。常用参数:-n显示文件的前n行,n大于实际行数时显示文件的所有内容;-n  -k  显示除最后k行外所有内容。
           tail:显示文章后面的内容。常用参数:-n  显示文章的最后n行;-f  动态查看文件中的内容,查看日志的时候会用到。
           grep:查找指定的文件内或者用管道传来的流中符合条件的字符串。常用参数:-v  不显示包含的字符串所在的行。
           file:识别文件类型。
          其他命令,如cutsplitpastesortuniqwciconvdos2unixdiffvimdffchattrlsattr ev ac大家有兴趣自己了解一下

    4、文件压缩及解压缩命令(4个):tarunzipgzipzip

    5、信息显示命令(12个):unamehostnamedmesguptimefilestatdudf opfreedatecal

    6、文件搜索命令(4个):whichfindwhereislocate

    7、用户管理命令(10个):useraddusermoduserdelgroupaddpasswdchageidsuvisudosudo

    8、基础网络操作命令(10个):telnetsshscpwgetping outeifconfigifupifdown etstat

    9、深入网络操作命令(6个):lsof outemailmutt slookupdig

    10、有关磁盘文件系统的命令(8个):mountumountdfdufsckdddumpe2fsdump
     
    11、关机和查看系统信息的命令(3个):shutdownharfinit

    12、系统管理相关命令(8个):uptime opfreevmstatmpstatiostatsarchkconfig

    13、系统安全相关命令(10个):chmodchownchgrpchagepasswdsusudoumaskchattrlsattr

    14、查看系统用户登录信息的命令(7个):whoamiwhowlastlastlogusersfinger

    15、查看硬件信息相关命令(8个):ifconfigfreefdiskethtoolmii-tooldmidecodedmesglspci

    16、其他(19个):              echoprintf pmyumwatchaliasunaliasdateclearhistoryeject ime ohup cxargsexecexportunset ype

    17、系统性能监视高级命令(12个):
           内存:top/free/vmstat/mpstat/iostat/sar
           CPU:top/vmstat/mpstat/iostat/sar
           I/O:vmstat/mpstat/iostat/sar/iotop
           进程:ipcs/ipcrm/lsof/strace/lstrace
           负载:uptime/mount/umount/df/du/fsck/dd/dumpe2fs/dump
              
    who                显示在线登陆用户
    whoami           显示当前操作用户
    hostname       显示主机名
    uname            显示系统信息
    ifconfig          查看网络情况
    ping 域名/ip地址       测试网络连通
    telnet ip地址 端口号 查看到某IP的某端口是否连通
    C:WindowsSystem32driversetc里面的hosts文件 windows系统ip地址映射
    vim /etc/hosts linux环境IP地址映射
    netstat           显示网络状态信息
    netstat -i   查看网络是否丢包
    netstat -lanp | grep 8080  查看端口是否运行
    chmod -R 777 文件名 更改文件权限
    /etc/profile    系统环境变量
    bash_profile      用户环境变量
    ulimit -a  系统设置的文件句柄数
    lsof |awk '{print $2}'|wc -l 统计系统中当前打开的总的文件句柄数

    查看整体系统日志   cat /var/log/messages
    查看系统授权和认证信息  cat /var/log/secure
    tail:
     实时产看日志文件   tail -f catalina.out
     搜索关键字附近日志   cat -n filename | grep "关键字"
     实时监控100行日志   tail -100f test.log
     查询日志尾部最后10行的日志  tail  -n  10  test.log
     查询10行之后的所有日志  tail -n +10 test.log
    head: 
     跟tail是相反的,tail是看后多少行日志,而head是查看日志文件的头多少行,例子如下:
     head -n 10  test.log   查询日志文件中的头10行日志;
     head -n -10  test.log   查询日志文件除了最后10行的其他所有日志;
    cat:
    tac是倒序查看,是cat单词反写;例子如下:
     cat -n test.log |grep "debug"   查询关键字的日志(常用!~)
     vim:
            1、进入vim编辑模式:vim filename
             2、输入“/关键字”,按enter键查找
            3、查找下一个,按“n”即可
            退出:按ESC键后,接着再输入:号时,vi会在屏幕的最下方等待我们输入命令
            wq! 保存退出
            q! 不保存退出

    列出几种常见的应用场景???:
    查看日志应用场景一:按行号查看:过滤出关键字附近的日志
         (1) cat -n test.log |grep "debug"  得到关键日志的行号
         (2) cat -n test.log |tail -n +92|head -n 20  选择关键字所在的中间一行. 然后查看这个关键字前10行和后10行的日志:
      tail -n +92表示查询92行之后的日志
      head -n 20 则表示在前面的查询结果里再查前20条记录
    查看日志应用场景二:根据日期查询日志
        (1) sed -n '/2014-12-17 16:17:20/,/2014-12-17 16:17:36/p'  test.log
    特别说明:
    上面的两个日期必须是日志中打印出来的日志,否则无效
    先 grep '2014-12-17 16:17:20' test.log 来确定日志中是否有该时间点
    查看日志应用场景三:日志内容特别多,打印在屏幕上不方便查看,分页/保存文件查看
        (1)使用more和less命令,
               如: cat -n test.log |grep "debug" |more     这样就分页打印了,通过点击空格键翻页
        (2)使用 >xxx.txt 将其保存到文件中,到时可以拉下这个文件分析
                如:cat -n test.log |grep "debug"  >debug.txt


    查看防火墙状态   service iptables status


    线程数  top -H -p 进程号、pstree -p 进程号|wc -l(结果加1为线程数)、cat /proc/进程号/status(其中threads为线程数,或使用cat /proc/进程号/status|grep Threads)、
       ls /proc/7260/task|wc -l、ps hH p 7260|wc -l

    nmon工具安装和使用
     nmon安装
      (1)使用ftp或其他工具上传已下载的nmon_x86.tar.gz文件到linux服务器
      (2)解压:tar -xzvf nmon_x86.tar.gz nmon(使用-c参数指定解压的目录)
      (3)修改文件可执行权限:chmod -R 777 nmon_x86
      (4)文件重命名:mv nmon_x86 nmon
     nmon使用
      (1)在nmon的安装目录执行./nmon
      (2)按c(CPU)、按m(内存)、按D(磁盘)、按t(进程)、按n(网络)、按h(帮助)、
              按k(内核)、按N(NFS统计)、按j(文件系统统计)、按V(虚拟内存统计)、按v(详细模式)、按q(推出)、
      (3)./nmon -f -t -s30 -c180
       -f 按照标准格式输出文件,服务器名_日期时间.nmon,如<hostname>_yyyyMMDD_HHmm.nmon
       -t 输出中包括占用率较高的进程
       -s 每?秒进行一次数据收集
       -c 一共收集多少次
       -m 指定文件保存目录
      (4)可以通过sort命令将nmon结果转换成CSV文件:sort -A 文件名>文件名.CSV
     采样过程中关闭数据采集
      (1)查找进程ID  ps -ef|grep nmon
      (2)杀掉该进程 kill -9 进程号
     数据分析
      (1)下载nmon analyser,在window环境下解压,其中word是说明文档,Excel就是nmon analyser工具
      (2)打开nmon analyser工具,点击Analyze nmon data按钮,添加采集到的nmon文件即可


    CPU
     cpu个数  cat /proc/cpuinfo|grep -c processor、top(按数字1)、lscpu
     cpu负载  top、uptime、w、sar -q 1、dstat -l、cat /proc/loadavg、watch cat /proc/loadavg
     cpu上下文切换 vmstat 1(其中cs为上下文切换)、pidstat -w 1(cswch/s表示每秒自愿上下文切换的次数,nvcswch/s 表示每秒非自愿上下文切换的次数)、cat /proc/interrupts|grep time
     cpu中断情况 cat /proc/interrupts、watch -d cat /proc/interrupts
     CPU占用  top、sar -u 1、mpstat 1、vmstat 1


    内存
     sar -r 1(%memused 为物理内存使用率,kbcommit为保证当前系统正常运行所需要的最小内存,%commit为kbcommit和内存总量的百分比,内存总量=物理内存+Swap区内存)
     sar -W 1 查看系统中swap区的统计信息(pswpin/s为每秒从交换区到系统的交换页面数量:系统换入, pswpout/s为每秒从系统交换到swap的交换页面:系统换出)
     vmstat 1(si为每秒从磁盘读入虚拟内存的大小,so为每秒从虚拟内存写入磁盘的大小)
     sar -v 1 进程、inode、文件和锁表状态
     sar -B 1 页交换速率


    磁盘
     df -h 磁盘的使用情况
     fdisk -l   查看磁盘分区信息

     sar -b 1 查看IO和传递速率的统计信息(tps为磁盘每秒中的IO总数)
     sar -d 1 磁盘使用详情统计
     iostat
     iostat -x 1


    网络
     网卡信息  
      ifconfig(查看网卡信息)、ethtool 网卡名(查询特定网卡信息,其中Speed为网速)
      ping 域名 或者 ping IP地址 查看网络是否能连通
      telnet ip地址 端口号  查看到某IP的某端口是否能连通
      netstat -lanp | grep 端口号 查看端口是否运行
      netstat -i    查看网络是否丢包
     网络带宽换算
      100Mbps=100Mbit/s即兆比特每秒
      100MB/s=100MBytes/s即兆字节每秒
      1B=8bit
      100Mbps=12.5MB/s即理论上百兆带宽下载速度
      数据存储:以10进制表示,1MiB=1000kB
     查看网卡流量 
      more /proc/net/dev、iptraf
      sar -n DEV 1 查看网络情况,其中rxKB/s表示每秒接受的数据量,txKB/s表示每秒发送的数据量
      sar -d -p 1
      iftop(按小写p显示端口信息、按n显示IP地址、按L显示流量图形、按数字1、2、3则根据右侧显示的三列流量数据进行排序)、
      iftop -i 网卡名 监控固定网卡,网卡名可通过ifconfig进行查看
      iftop -F ip地址/24或者iftop -F ip地址/225.225.225.0 监控特定网段的进出流量(按小写p显示端口信息、按n显示IP地址,或者使用iftop -F IP地址/24 -P -n)
     定位网络瓶颈
      (1)ifconfig 查看当前服务器的网卡
      (2)ethtool 网卡名 查看特定网卡信息,确定网络带宽
      (3)sar -n DEV 1 查看网络情况
      (4)iftop -P -n 或者使用 iftop -F IP地址/24 -P -n 查看占用流量高的端口
      (5)lsof -i:端口号 或者 netstat -tunp|grep 端口号 查看运行在这个端口上的进程号
      (6)ps -ef|grep 进程号 查看进程对应的应用程序
     能ping通IP地址,但是ping不同域名
      问题描述:
       (1)ping ip地址       测试网络连通
       (2)ping 域名 网络测试不通
       (3)telnet ip地址 端口号 查看到某IP的某端口连通
      解决方法:
       (1)windows系统ip地址映射 C:WindowsSystem32driversetc 在里面的hosts文件中添加IP地址和对应域名
       (2)linux系统IP地址映射 vim /etc/hosts 

    jps
     (1)jps   查看具有访问权限的java进程,包括进程ID,进程启动的路径及启动参数等
     (2)jps -v  显示传递的JVM参数
     (3)jps -l   显示应用程序主类的完整程序包名称或应用程序JAR文件的完整路径名称
     (4)jps -J -Xms48m  将选项传递给JVM,如将启动内存设置为48 MB
    jstat
     (1)jstat -gc 进程号  显示有关垃圾回收堆的行为的统计信息
     (2)jstat -gcutil 进程号 显示关于垃圾收集统计信息的摘要
     (3)jstat -gccapacity  进程号 各个垃圾回收代容量(young,old,perm)和他们相应的空间统计
     (4)jstat -gccause  进程号 垃圾收集统计概述(同-gcutil),附加最近两次垃圾回收事件的原因
     (5)jstat -class  进程号 显示有关类加载器行为的统计信息
     (6)jstat -gcnew  进程号 显示新生代行为的统计信息
     (7)jstat -gcnewcapacity  进程号 显示有关新生代及其相应空间大小的统计信息
     (8)jstat -gcold  进程号 显示有关老年代和metaspace统计信息的统计信息
     (9)jstat -gcoldcapacity  进程号 年老代行为统计
     (10)jstat -gcmetacapacity  进程号 显示有关元空间大小的统计信息
     (11)jstat -compiler  进程号 显示有关Java HotSpot VM即时编译器行为的统计信息
     (12)jstat -printcompilation  进程号 显示Java HotSpot VM编译方法统计信息
    jmap
     (1)jmap -heap pid  获取该进程整个堆的信息
     (2)jmap -histo pid  展示class的内存情况,instances(对象的实例数)、bytes(总占用字节数)、classs name(类名)
     (3)jmap?-histo pid>a.log ?观察heap中所有对象的情况,如果只抓取存活的对象则加上live,jmap -histo:live 。这个命令执行,JVM会先触发gc,然后再统计信息
     (4)jmap -dump:live,format=b,file=a.log pid 将内存使用的详细情况输出到文件,该命令通常用来分析内存泄漏OOM  
      
    jinfo 
     (1)jinfo -flags pid  查看JVM参数
     (2)jinfo -sysprops pid 查看系统参数
     (3)java -XX:+PrintFlagsFinal -version | grep manageable 查看虚拟机参数
     (4)jinfo -flag MaxMetaspaceSize pid    查看最大元空间大小
     (5)jinfo -flag ThreadStackSize pid   查看栈内存大小
     (6)jinfo -flag MaxHeapSize pid   查看最大堆内存大小
     (7)查看所使用的垃圾收集器
      1)jinfo -flag UseConcMarkSweepGC pid
      2)jinfo -flag UseG1GC pid
      3)jinfo -flag UseParallelGC pid
    jcmd
     (1)jcmd -l    列出当前运行的所有虚拟机
     (2)jcmd pid help   使用help命令列出虚拟机支持的所有命令
     (3)jcmd pid VM.uptime ?  查看虚拟机启动时间VM.uptime
     (4)jcmd pid ThreadPrint(进程id)  打印线程栈信息Thread.print
     (5)jcmd pid GC.class_histogram ? 查看系统中类统计信息GC.class_histogram
     (6)jcmd pid GC.heap_dump 保存路径/文件名 导出堆信息GC.heap_dump,eg:jcmd 19609 GC.heap_dump a.txt
     (7)jcmd pid VM.system_properties? 获取系统Properties内容VM.system_properties
     (8)jcmd 19609 VM.flags   获取启动参数VM.flags
     (9)jcmd pid PerfCounter.print  获取所有性能相关数据PerfCounter.print
     (10)jcmd process_id VM.native_memory summary ?查看原生内存信息:VM.native_memory summary,jcmd pid VM.native_memory [summary | detail | baseline | summary.diff | detail.diff | shutdown] [scale= KB | MB | GB]


    一、us用户态cpu高
     现象:压测过程中,使用top命令查看系统资源占用情况,us cpu过高,超过50%以上。
     排查手段:
      (1)使用top命令是哪个进程消耗CPU高
      (2)再找到CPU消耗高的线程:top -H -p 进程号
      (3)把线程号转换成16进制:printf "%x " 线程号
      (4)再用jstack命令分析这个线程是在干什么,生成Thread Dump日志:jstack 进程号 | grep 16进制的线程号
       或者使用:jstack 进程ID或者jstack -l 进程ID
       非java进程使用perf top -p 线程号
      (5)或者查看指定线程的dump日志:jstack  <pid>|grep 线程ID  -A 30
      (6)通过JProfiler的CPU Views视图的层层分析,可以清楚的找到造成CPU高的原因

    二、sy系统态cpu高
     现象:压测过程中,使用top命令查看系统资源占用情况,sy cpu过高,超过50%以上。
     排查手段:
      (1)首先查看磁盘繁忙程度、磁盘的队列(iostat、nmon)
      (2)如果磁盘没有问题,则使用strace查看系统内核调用情况

    三、内存溢出
    1、堆内存溢出
     现象:
      (1)压测执行一段时间后,系统处理能力下降。这时用JConsole、JVisualVM等工具连上服务器查看GC情况,每次GC回收都不彻底并且可用堆内存越来越少。
      (2)压测持续下去,最终在日志中有报错信息:java.lang.OutOfMemoryError.Java heap space。
     排查手段:
      (1)使用jmap -histo pid > test.txt命令将堆内存使用情况保存到test.txt文件中,打开文件查看排在前50的类中有没有熟悉的或者是公司标注的类名,如果有则高度怀疑内存泄漏是这个类导致的。
      (2)如果没有,则使用命令:jmap -dump:live,format=b,file=test.dump pid生成test.dump文件,然后使用MAT进行分析。
      (3)如果怀疑是内存泄漏,也可以使用JProfiler连上服务器在开始跑压测,运行一段时间后点击“Mark Current Values”,后续的运行就会显示增量,这时执行一下GC,观察哪个类没有彻底回收,基本就可以判断是这个类导致的内存泄漏。
     解决方式:优化代码,对象使用完毕,需要置成null。
    2、永久代 / 方法区溢出
     现象:压测执行一段时间后,日志中有报错信息:java.lang.OutOfMemoryError: PermGen space。
     产生原因:由于类、方法描述、字段描述、常量池、访问修饰符等一些静态变量太多,将持久代占满导致持久代溢出。
     解决方法:修改JVM参数,将XX:MaxPermSize参数调大。尽量减少静态变量。
    3、栈内存溢出
     现象:压测执行一段时间后,日志中有报错信息:java.lang.StackOverflowError。
     产生原因:线程请求的栈深度大于虚拟机所允许的最大深度,递归没返回,戒者循环调用造成。
     解决方法:修改JVM参数,将Xss参数改大,增加栈内存。栈内存溢出一定是做批量操作引起的,减少批处理数据量。
    4、系统内存溢出
     现象:压测执行一段时间后,日志中有报错信息:java.lang.OutOfMemoryError: unable to create new native thread。
     产生原因:操作系统没有足够的资源来产生返个线程造成的。系统创建线程时,除了要在Java堆中分配内存外,操作系统本身也需要分配资源来创建线程。因此,当线程数量大到一定程度以后,堆中或许还有空间,但是操作系统分配不出资源来了,就出现这个异常了。
     解决方法:
        (1)减少堆内存
        (2)减少线程数量
        (3)如果线程数量不能减少,则减少每个线程的堆栈大小,通过-Xss减小单个线程大小,以便能生产更多的线程。
    四、内存泄漏
    排查手段:
     1)导出堆
      方法一:使用 jconsole 选项通过 HotSpotDiagnosticMXBean 从运行时获得堆转储(生成dump文件)
      方法二:虚拟机启动时如果指定了 -XX:+HeapDumpOnOutOfMemoryError 选项, 则在抛出 OutOfMemoryError 时, 会自动执行堆转储:-XX:+HeapDumpOnOutOfMemoryError?-XX:HeapDumpPath=/path
      方法三:jmap??-dump:format=b,file=/path/heap.bin?进程ID 将内存使用的详细情况输出到文件,如果只抓取存活的对象则加上live,如jmap??-dump:live,format=b,file=heap.bin?进程ID
     2)分析堆文件
      方法一:
       (1)jhat -J-Xmx512m <heap dump file> 解析Java堆转储文件,并启动一个 web server
       (2)http://ip:7000/ 查看html,服务器的IP地址,默认开启的端口为7000
      方法二:
       使用MAT分析工具,eclipse的mat插件
      方法三:
       使用jdk中的jvisualvm.exe工具,载入dump文件

    五、单个JVM进程打开过多的文件句柄
     现象:
      会报java.net.SocketException:Too many open files错误
     排查手段:
      (1)ps -ef |grep tomcat 查看tomcat的进程ID,记录ID号,假设进程ID为10001
      (2)lsof -p 10001|wc -l 查看当前进程id为10001的 文件操作数
      (3)使用命令:ulimit -a 查看每个用户允许打开的最大文件数

  • 相关阅读:
    javascript概述
    linux系统编程(一)概述
    软件工程
    SQL
    数据结构和算法(一)概述
    cpp标准库
    c语言标准库
    c/c++概述
    编程语言的思考
    GCD学习
  • 原文地址:https://www.cnblogs.com/jingdenghuakai/p/13844517.html
Copyright © 2020-2023  润新知