?
前面主要内容为工作常用的东西,属于经验总结类
后面重点是IO多路复用,这也是Linux中最常问的技术点
VIM ?? ?命令模式 ?? ??? ?a——当前光标后插入内容 ?? ??? ?i——当前光标前插入内容 ?? ??? ?A——光标所在行尾插入内容 ?? ??? ?I——光标所在行首插入内容 ?? ??? ?o——光标所在行的后一行插入新行 ?? ??? ?O——光标所在行的前一行插入新行 ?? ??? ?G——移动到最后一行 ?? ??? ?gg/1G——移动到首行 ?? ??? ?#G——移动到指定#行,#是数字 ?? ??? ?:n——跳到n行 ?? ??? ?ctrl+f/ctrl+b 前后翻页 ?? ??? ?ctrl+d/ctrl+u 前后翻半页 ?? ?编辑模式 ?? ??? ?dd——删除光标所在行 ?? ??? ?ndd——删除从光标处开始的5行 ?? ??? ?yy——复制光标所在行 ?? ??? ?nyy——复制从光标处开始的5行 ?? ??? ?n——显示搜索命令定位到的下一个字符串 ?? ??? ?N——显示搜索命令定位到的上一个字符串 ?? ??? ?u——撤销上一步的操作 ?? ??? ?p——将之前删除或复制过的数据粘贴到光标后面 ?? ??? ?:w——保存 ?? ??? ?:q——退出 ?? ??? ?:q!——强制退出 ?? ??? ?:set nu——显示行号,:set nonu——不显示 ?? ??? ?:命令——执行该命令 ?? ??? ?:整数——跳转到该行 ?? ??? ?:s/one/two——将当前光标行第一个one替换成two ?? ??? ?:s/one/two/g——将当前光标行所有one替换成two ?? ??? ?:%s/one/two/g——全文one替换成two ?? ??? ?:n,ms/one/two/g——n到m行替换 ?? ??? ??abc——从下往上搜索abc字符串 ?? ??? ?/abc——从上往下搜索abc字符串 ?? ?ESC ?? ??? ?退出编辑模式
常用命令 ?? ?find path -name "*.py"——查找path路径下后缀是py的文件 ?? ?tar 打包/解压 ?? ??? ?打包——tar -cvf ?xxx.tar.gz xxx ?? ??? ?解压——tar -xvf ?xxx.tar.gz ?? ?grep ?? ??? ?grep 'fatal\|error\|critical' /var/log/nginx/error.log——或搜索\转义 ?? ??? ?grep -E 'fatal|error|critical' /var/log/nginx/error.log——或搜索,不需要转义 ?? ??? ?grep -i ——忽略大小写搜索 ?? ??? ?grep -w 'fatal' /var/log/nginx/error.log——搜索fatal单词字符串,不加-w,只要该行含有fatal即输出 ?? ??? ?grep -v abc ——不包含查找 ?? ??? ?grep -C 10 xxx ——匹配的前后10行显示 ?? ?> 重定向覆盖 ?? ?>> 重定向追加 ?? ?管道符 | —— 一个命令输入作为另一个命令的输入 ?? ?awk ?? ??? ?awk -F\| '{print $1,$4}' a.txt——按照|分割后,打印第一个和第四个 ?? ?uniq ?? ??? ?uniq a.txt——输出去除重复后的行 ?? ??? ?uniq -c a.txt——输出重复行以及重复次数 ?? ?sort ?? ??? ?sort a.txt——ASCII排序
系统命令 ?? ?date —— 查看系统时间 ?? ?cal ——日历,-y查看一年日历 ?? ?su - 用户 ——切换用户,直接su切换到root ?? ?top ?? ??? ?P——按照CPU使用排序 ?? ??? ?M——按照内存使用排序 ?? ??? ?T——按照累计CPU排序 ?? ??? ?top - 14:46:14 up 16 days, ?4:04, ?1 user, ?load average: 0.01, 0.02, 0.05 ?机器时间 ?机器持续运行时间 ?在线用户数量 ?系统负载(1min 5min 15min) ? 详情——cat /proc/loadavg ?? ?ps ?? ??? ?-ef:To see every process on the system using standard syntax aux:To see every process on the system using BSD syntax -eo:To see every process with a user-defined format -mp:列出指定进程的子进程 -L:显示线程,可能使用LWP和NLWP列 ?? ??? ?ps -ef | grep 'xx' ps aux | grep 'xx' ps au --sort -pcpu | more:查看哪些进程的CPU占用率最高 ps -eo stat,pid,user,%cpu,%mem,time,cmd:查看进程状态 ps -eo stat,pid,user,%cpu,%mem,time,cmd | grep -e '^[R]':查看运行中的进程状态 ps au -L | grep R:查看运行中的进程+线程状态 ps -mp <pid> -o stat,tid,user,%cpu,%mem,time,wchan | sort -rn:根据进程id查看其线程状态 ps -Lp <pid> cu | more:查看JAVA进程的每个线程的CPU占用率 ps -efL | wc -l:列出机器总线程数 ?? ?查看系统——cat /etc/redhat-release ?? ?查看内核——uname -a 或 cat /proc/version ?? ?tar ?? ??? ?压缩 ?? ??? ??? ?tar –cvf xx.tar /tmp/ --exclude /tmp/test.txt /opt/ -> 打包为tar包 ?? ??? ??? ?tar –czvf xx.tar /tmp/ --exclude /tmp/test/ /opt/ -> 打包为tar.gz包 ?? ??? ?解压 ?? ??? ??? ?tar –xvf xx.tar -> 解压tar包 ?? ??? ??? ?tar -xzvf xx.tar.gz -> 解压tar.gz ?? ?网络 ?? ??? ?统计网络连接状态 ?? ??? ??? ?netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'? ?? ??? ??? ??? ?TIME_WAIT 814 CLOSE_WAIT 1 FIN_WAIT1 1 ESTABLISHED 634 SYN_RECV 2 LAST_ACK 1 ?? ?nc ?? ??? ?参数 ?? ??? ??? ?-g<网关> 设置路由器跃程通信网关,最多可设置8个。 -G<指向器数目> 设置来源路由指向器,其数值为4的倍数。 -h 在线帮助。 -i<延迟秒数> 设置时间间隔,以便传送信息及扫描通信端口。 -l 使用监听模式,管控传入的资料。 -n 直接使用IP地址,而不通过域名服务器。 -o<输出文件> 指定文件名称,把往来传输的数据以16进制字码倾倒成该文件保存。 -p<通信端口> 设置本地主机使用的通信端口。 -r 乱数指定本地与远端主机的通信端口。 -s<来源位址> 设置本地主机送出数据包的IP地址。 -u 使用UDP传输协议。 -v 显示指令执行过程。 -w<超时秒数> 设置等待连线的时间。 -z 使用0输入/输出模式,只在扫描通信端口时使用。 ?? ??? ?TCP端口扫描 ?? ??? ??? ?# nc -v -z -w2 192.168.0.3 1-100? 192.168.0.3: inverse host lookup failed: Unknown host (UNKNOWN) [192.168.0.3] 80 (http) open (UNKNOWN) [192.168.0.3] 23 (telnet) open (UNKNOWN) [192.168.0.3] 22 (ssh) open ?? ??? ??? ?扫描192.168.0.3 的端口 范围是 1-100 ?? ??? ?扫描UDP端口 ?? ??? ??? ?# nc -u -z -w2 192.168.0.1 1-1000 //扫描192.168.0.3 的端口 范围是 1-1000 ?? ??? ?扫描指定端口 ?? ??? ??? ?# nc -nvv 192.168.0.1 80 //扫描 80端口 (UNKNOWN) [192.168.0.1] 80 (?) open y ?//用户输入 ?? ??? ?测试网络连通性 ?? ??? ??? ?nc -zv 172.21.44.85 8379
CPU ?? ?查看物理CPU个数:cat /proc/cpuinfo | grep "physical id" | uniq | wc -l ?? ?load值持续大于0.7,必须开始找问题出在哪里,防止情况恶化; load值持续大于1.0,解决问题已迫在眉睫; load值持续大升高达到5.0,表示各种请求几乎得不到响应,机器几近崩溃; 对于多核机器,则需要根据CPU个数来判断系统负载是否过高。如,若认为0.7算是单核机器负载的安全线的话,则四核机器的负载最好保持在3(4*0.7 = 2.8)以下。
内存 ?? ?free -m ?? ?访问纳秒级 ns ? 单位字节
磁盘 ?? ?df -h 查看磁盘大小 ?? ?du -h /apprun 列出apprun目录下的文件和文件夹大小 ?? ?访问微秒级 us ?单位字节
网络 ?? ?netstat ?? ??? ?Proto:协议(tcp, udp, udpl, raw) Recv-Q:网络接收队列,接收的网络数据,但还未被用户程序接收的字节数 Send-Q:网络发送队列,发送的网络数据,但还未被对端主机ACK的字节数 Local Address:本地IP+端口 Foreign Address:对端IP+端口 State:连接状态,详见Java网络编程系列之TCP连接状态 PID/Program name:进程id/程序名称 ?? ??? ?netstat -naltup netstat -naltup | uniq | wc -l netstat -naltp | egrep 'LISTEN|ESTABLISHED|TIME_WAIT|CLOSE_WAIT' | awk '{print $6}'| sort | uniq -c | sort -rn ?? ?tcpdump ?? ??? ?tcpdump host 10.253.8.222 -> 监听本机和指定主机的通信 tcpdump host ! 10.253.8.222 -> 监听本机和指定主机之外的其他主机的通信 tcpdump host 10.253.8.222 and 10.37.18.28 -> 监听特定主机之间的通信 tcpdump host 10.253.8.222 and ! 10.37.18.28 -> 监听10.253.8.222和除10.37.18.28之外主机的通信 tcpdump port 28051 and host 10.253.8.222 -> 监听本机和指定主机在特定端口上的通信 tcpdump port ! 28051 and host 10.253.8.222 -> 监听本机和指定主机在非特定端口上的通信 tcpdump tcp port 28051 and host 10.253.8.222 -> 监听本机和指定主机在特定端口上的tcp通信 tcpdump tcp -s 0 -c 1000 -n -w /tmp/tcpdump_save.cap and port 28051 ? -c指定抓多少个包
系统参数 ?? ?文件句柄数 ?? ??? ?ulimit -a——查看 ?? ??? ?cat /proc/sys/fs/file-max——系统全局参数 ?? ??? ?/etc/security/limits.conf——修改 ?? ??? ??? ?* ? ? ? ? ? ? ? soft ? ?nproc ?512000 * ? ? ? ? ? ? ? hard ? ?nproc ?512000 * ? ? ? ? ? ? ? soft ? ?nofile ?512000 * ? ? ? ? ? ? ? hard ? ?nofile ?512000 * ? ? ? ? ? ? ? soft ? ?stack ? 512000 * ? ? ? ? ? ? ? hard ? ?stack ? 512000 * ?? ? ? ? ? soft memlock unlimited? * ? ? ? ? hard memlock unlimited?
IO模型 ?? ?传统阻塞IO BIO ?? ??? ?一个独立的Acceptor线程来监听客户端连接 ?? ??? ?每当有客户端来连接,就分配一个线程来处理 ?? ??? ?客户端连接多的情况,线程数多,资源瓶颈 ?? ??? ?建立连接后,线程阻塞读写 ?? ??? ?举例 ?? ??? ??? ?餐厅点餐 ?? ??? ??? ?来一位客户,一位服务员等待着点餐 ?? ??? ??? ?服务员就是一个线程,一直等着你点菜,什么也干不了 ?? ?非阻塞IO ?NIO ?? ??? ?用户态线程会一直轮询内核态数据是否准备好,会一直占用CPU ? O(N) ?? ??? ?减少了线程数 ?? ?IO多路复用 ?? ??? ?多路 ?? ??? ??? ?对比:同步阻塞 ?? ??? ??? ??? ?线程A发起read请求 ?? ??? ??? ??? ?内核等待数据到达 ?? ??? ??? ??? ?数据拷贝 ?? ??? ??? ??? ?read完成 ?? ??? ??? ??? ?全程用户线程阻塞 ?? ??? ??? ??? ?必须多线程处理多个socket请求 ?? ??? ??? ?用户可以在一个线程内同时处理多个socket的IO请求 ?? ??? ??? ?在同一个线程内同时处理多个IO请求的目的 ?? ??? ?监听多个描述符,一旦某个描述符就绪,能够通知应用程序读写,需要select poll epoll来完成 ?? ??? ?程序一次系统调用传入N个client,由内核自己完成遍历,返回可用的socket,客户端再recv确定的socket ?? ??? ?select ?? ??? ??? ?O(N) ?? ??? ??? ?当有IO事件发生,需要轮询所有的描述符,找出正确读写的描述符 ?? ??? ??? ?最大连接数限制 ?? ??? ??? ?每次传递大量的FD给内核 ?? ??? ??? ?每次都要重新遍历FD ?? ??? ?Linux 同步IO多路复用器 ?? ??? ??? ?需要客户端自己去读取数据 ?? ??? ??? ?只能拿到状态 ?? ??? ??? ?减少了系统调用次数 ?? ??? ?poll ?? ??? ??? ?O(N) ?? ??? ??? ?没有最大连接数限制,链表存储 ?? ??? ?epoll ?? ??? ??? ?O(1) ?? ??? ??? ?事件驱动 ?? ??? ??? ?mmap ?? ??? ?见redis 思维导图详细说明 ?? ?strace追踪 ?? ??? ?strace -ff -o xx java xxx ?
|