实习秋招linux和网络编程知识点总结

实习/秋招时按自己需求总结的知识点,内容并不十分详细,建议选择性阅读。
部分图片已失效。

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.html

    grep -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
在这里插入图片描述

线程池

在这里插入图片描述

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值