实习/秋招时按自己需求总结的知识点,内容并不十分详细,建议选择性阅读。
部分图片已失效。
git常用命令速查表
git回滚
https://www.jianshu.com/p/f7451177476a
命令
vim配置
set termencoding=utf-8
set encoding=utf8
set fileencodings=utf8,ucs-bom,gbk,cp936,gb2312,gb18030
set paste
set ts=4
linux命令面试题
https://blog.csdn.net/a303549861/article/details/93754526
- 在根目录下查找core文件,如果未找到则直接删除
find / -name core -exec rm {} ;
- 查找字符串str是否在文件夹dir下的某个文件中出现:
grep的用法
https://www.cnblogs.com/iSun520/p/11277107.htmlgrep -r str dir
- df查看磁盘使用空间
- uniq命令去重/统计,一般与sort混用
sort | uniq -c # 根据第一个字段排序后统计出现的次数,返回的第一列是出现次数
- 打印etc/passwd的1-100行
sed -n ‘1,100p’ etc/passwd # 使用sed命令
- 查看进程发生缺页中断的次数
ps -o majflt,minflt -C program
- 文件传输命令
scp
nc
ftp
rsync
rz -be 传二进制文件,从windows传linux
sz 从linux传到windows - 格式化/定制打印
sed -n ‘2,5p’ # 打印第2-5行
awk ‘{for(i=2;i<10;i++) print $i}’ # 打印第2-9列 - 查看占用端口情况
lsof -i :80
netstat -tunlp | grep 22
压缩命令
-
tar 命令
创建一个新的 tar 文件: tar cvf archive_name.tar dirname/ 。
解压 tar 文件:tar xvf archive_name.tar 。
查看 tar 文件:tar tvf archive_name.tar 。
解压tgz文件: tar xvf xxx.tgz -
gzip 命令
创建一个 *.gz 的压缩文件:gzip test.txt 。
解压 *.gz 文件:gzip -d test.txt.gz 。
显示压缩的比率:gzip -l *.gz 。 -
bzip2 命令
创建 *.bz2 压缩文件:bzip2 test.txt 。
解压 *.bz2 文件:bzip2 -d test.txt.bz2 。 -
unzip 命令
解压 *.zip 文件:unzip test.zip 。
查看 *.zip 文件的内容:unzip -l jasper.zip -
查找某一命令的位置:whereis
-
查找java相关进程
ps -ef | grep java
jps -m
- w,uptime命令查看机器负载
后三行分别表示1min,5min,15min的平均负载,如果1min很高,则说明当前负载较大,需要通过vmstat,mpstat,sar等命令进一步排查问题
- vmstat查看机器负载
命令中的1表示每隔一秒查一次
r表示等待CPU资源的进程数(不含等等IO的进程),若大于CPU数目则说明CPU资源饱和;
free表示剩余内存,用free命令查看会更详细;
buff是写缓存,用于延迟写入磁盘,cache是读缓存,用于提升读性能;
si,so是交换区的读写,若大于0,则说明物理内存不够用;
- mpstat查看每个CPU的使用情况
显示了CPU的负载,若某个CPU满载,则可能是某个单线程程序引起的
- pidstat命令查看每个进程使用CPU的情况
图中两个java进程占了1600%的CPU,说明使用了16个CPU
- iostat查看io情况
r/s, w/s, rkB/s, wkB/s:分别表示每秒读写次数和每秒读写数据量(千字节)。读写量过大,可能会引起性能问题
-
dmesg命令查看系统日志,可以看出是那些进程在运行过程中出了问题
-
sar查看网络设备吞吐率
sar -n DEV 1
-
sar查看TCP连接状况
sar -n TCP, ETCP 1
sar命令在这里用于查看 TCP 连接状态,其中包括:
active/s:每秒本地发起的TCP连接数,既通过connect调用创建的TCP连接;
passive/s:每秒远程发起的TCP连接数,即通过accept调用创建的TCP连接;
retrans/s:每秒TCP重传数量;
TCP 连接数可以用来判断性能问题是否由于建立了过多的连接,进一步可以判断是主动发起的连接,还是被动接受的连接。TCP 重传可能是因为网络环境恶劣,或者服务器压力。
-
sar查看系统的历史负载,如(22号的)
sar -q -f /var/log/sa/sa22 # 查看22号的网络负载
-
top查看网络负载,包含系统负载使用情况uptime,系统内存使用情况iostat,系统CPU使用情况vmstat,mpstat等命令的内容
-
netstat查看系统开启的端口
netstat -lnp
-
netstat查看网络连接状况
netstat -an
-
tcpdump命令抓取目标IP为192.168.0.111的HTTP服务,共1000个包,并保存到text.txt中
tcpdump -nn -s0 host 192.168.0.111 and port 80 -c 1000 -w text.txt
使用tcp -A -i text.txt查看包的内容 -
etc/hosts文件的作用
指定ip到域名的映射关系 -
dig命令配置dns服务器,如
dig @8.8.8.8 www.baidu.com
-
wc统计一个文件的行数
wc -l txt.txt
-
tail查看日志文件尾端,不断显示新增内容
tail -f text.log
-
crontab命令
用于设置系统周期性所要执行的工作,比如写缓存到硬盘,日志清理等,见etc/crontab文件
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=""HOME=/#run-parts
#下述字段
#分 #时 #日 #月 #周 #主 #命令 #因此从右往左读执行的顺序
51 * * * * root run-parts /etc/cron.hourly
24 7 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly
45 4 1,10,22 * * /etc/init.d/smb restart # 每月的1号,10号,22号的4:45重启smb
系统
安全
- CC攻击,指页面攻击,模拟多个用户不断访问页面,耗尽系统资源
- DDOS攻击,即分布式拒绝服务攻击,联合多个计算机作为攻击平台,利用大量的合法请求占用网络资源,使得网络瘫痪
- SQL注入,指由于程序员没有对用户的输入进行合法性检查,用户在web界面提交大量的SQL查询语句,返回其想要得到的数据,即SQL注入。管理员应养成查看日志的习惯
- SYN Flood攻击
访问网站慢的可能原因
- 服务带宽不够用 ——增加带宽
- 服务器负载过大
用uptime,w,top,free,iostat等命令查看负载,如果CPU,内存,io正常,则用sar分析网卡流量,判断是否遭受攻击 - 数据库瓶颈
查询满,考虑SQL优化
数据库响应慢,考虑加缓存,如Redis,也可以多台SQL服务器,主服务器负责写,多个从服务器负责读,分摊读写压力
软链接和硬链接
- 硬链接
指向源文件inode的指针,不会重新分配inode,每添加一个硬链接,inode的链接数就加一 - 软链接
会重新分配inode,保存了源文件的路径,类似于快捷方式,可以跨分区链接,而硬链接不行;源文件移动时,软链接会失效
实际使用软链接更多
IO多路复用
顾名思义,采用一个进程/线程处理多个IO请求,在网络编程环境中,这里的IO通常指Socket
https://blog.csdn.net/zhouguoqionghai/article/details/82531523 Linux IO多路复用理解 ——包含源代码
https://www.cnblogs.com/aspirant/p/9166944.html
select、poll、epoll之间的区别(搜狗面试) ——从时间复杂度、IO性能、消息传递方式进行对比https://blog.csdn.net/zgege/article/details/81632990
网络编程-select,poll.epoll区别于联系 ——包含源代码,从底层实现分析
select和poll相似,epoll在linux系统独有,而kqueue和epoll类似,用于Mac OS
kqueue用法详见
https://www.cppentry.com/bencandy.php?fid=104&id=138645
select和poll
两者实现较近,且均为水平触发LT,故一起说明
主要区别在于,select用fd_set数组,select有最大连接数的限制(取决于机器,通常为1024);poll用pollfd,且poll采用了链表,故没有最大连接数的限制。对于一个进程维护的多个socket连接(可能达数百万个),select和poll不知道有哪些连接有事件发生,因此需轮询其维护的数组
- 有事件来临时,网卡通过中断通知内核进行读写(从用户态切换到内核态的方式之一),同时select或poll将其维护的数组从用户态拷贝到内核态,然后读取从内核态反馈的内容,每来临一个事件就要做此操作,缺点有二:
1.频繁的用户态到内核态的数据拷贝,时间复杂为O(n),而用户态和内核态的切换本身就需要较大开销;
2.用户态读取到返回的数据后,需再次轮询文件描述符fd,时间复杂度为O(n) - 无事件时,select和poll被阻塞,进程休眠,新事件来临时,select/poll不知道是哪个fd的事件,需轮询,时间复杂度为O(n)
epoll
在linux内核实现了一个简易的文件系统,采用回调机制,用于处理此类事件,主要涉及三个函数
- epoll_create,创建epoll对象,在内核初始化红黑树和链表;
1.红黑树rbn,用于对socket连接(保存的是fd)的增删查改,十分高效
2.链表rdllist,用于存放准备好事件的fd, - epoll_ctl,将socket存放在红黑树中;
- epoll_wait,读取链表中的准备好的事件并处理
当有事件来临时,回调函数将该事件的fd放入list中,因此程序只需读取list中的内容即可找到有事件的连接,处理好后返回至用户态
https://zhidao.baidu.com/question/1707939375032207620.html
优点
- 使用红黑树对fd进行查删,效率更高;
- 采用回调机制将有事件的fd保存在链表中,避免对所有的fd进行遍历;
- 没有最大打开文件限制
- 避免了频繁大量的从用户态到内核态的数据拷贝
epoll既支持水平触发LT也支持边沿触发ET
epoll的空转问题
是JDK对其实现的bug,问题在于即便没有事件,epoll也不断轮询fd,最终导致程序崩溃
解决
采用NIO框架如Netty
NIO:同步非阻塞IO
注:linux2.6之后采用mmap实现了用户空间和内核空间的内存共享
ET和LT
https://www.jianshu.com/p/d3442ff24ba6
epoll的LT和ET
LT
水平触发,Level Triggered
支持阻塞和非阻塞模式,是Linux的默认方式
当有事件发生时,进程会一直通知,若该事件未处理,则下次有事件再调用epoll_wait时还会通知该事件
适合并发量较小的程序
ET
边沿触发, Edge Triggered
只支持非阻塞模式
有事件发生时,内核只通知一次该事件,即便内核没有处理该事件,下次再调用时也不会再通知
在高并发程序中效率优于LT
ET优于LT的原因
在epoll中,内核在调用epoll_wait查找rdllist以确定准备就绪的事件的fd
- 若采用ET模式,则epoll_wait通知该事件后,就会将其从链表中删除;
- 若采用LT模式,则epoll_wait通知该事件后,若内核未处理该事件,则依然将其存放在链表中,这也是LT模式下会多次通知的原因。
在高并发环境中,可能会有许多事件未能及时处理,那么rdllist就会线性增大,为O(n)复杂度,影响性能
非阻塞模式下,当并发量小时,采用LT,因为LT读写简单易维护;
高并发时,采用ET,因为效率更佳
阻塞和非阻塞IO
- 阻塞模式下,若从网络流中读取不到指定大小的数据,程序就会陷入阻塞,一直等待
- 非阻塞模式下,若读不到指定大小的数据,就会直接返回
因此非阻塞比阻塞模式由更高的性能,但是实现更复杂
- 阻塞读,有数据就读,没数据就等待,但是若读到的数据少于指定的长度(说明可能读完),则会返回
- 非阻塞读,没数据就返回,有数据就会一直读
- 阻塞写,一直写,写不了就等待,直到数据全部写完
- 非阻塞写,有多少写多少,在网络拥堵的情况下,可能会只写一部分
https://www.zhihu.com/question/19732473
我们讨论的阻塞和非阻塞IO都是同步的,只有调用了特殊的API才是异步IO