面试系列 - 记录面试中遇到的常用问题

Table of Contents

1、linux僵尸进程创建、查询、解决

2、http常见状态码讲解

3、linux启动顺序

4、TCP的三次握手与四次挥手

5、如果docker容器挂掉怎么办

6、sed、awk截取ip、空行等

7、nginx高可用负载均衡实现原理

8、MySQL主从原理


1、linux僵尸进程创建、查询、解决

# 僵尸进程介绍   

    僵尸进程(Zombie Process):就是bai已经结束了du的进程,但是没有从进zhi程表中删除。太多了会导致进程表里面条dao目满了,进而导致系统崩溃,倒是不占用其他系统资源。
    在Linux进程的状态中,僵尸进程是非常特殊的一种,它已经放弃了几乎所有内存空间,没有任何可执行代码,也不能被调度,仅仅在进程列表中保留一个位置,记载该进程的退出状态等信息供其他进程收集,除此之外,僵尸进程不再占有任何内存空间。它需要它的父进程来为它收尸,如果他的父进程没安装SIGCHLD信号处理函数调用wait或waitpid()等待子进程结束,又没有显式忽略该信号,那么它就一直保持僵尸状态,如果这时父进程结束了,那么init进程自动会接手这个子进程,为它收尸,它还是能被清除的。但是如果如果父进程是一个循环,不会结束,那么子进程就会一直保持僵尸状态,这就是为什么系统中有时会有很多的僵尸进程。

# 模拟创建一个僵尸进程

[root@k8s-master ~]# cat zombie.c
// zombie.c
/* create a zombie process*/
#include <sys/types.h>
//#include <signal.h>
#include <unistd.h>
#include <stdlib.h>

int main()
{
    if(!fork()){ //create child proce
        if(fork()){ //child
            while(1){
                sleep(5);
            //    break;
            }
        }
    }
    return 0;
# 编译c语言脚本并执行
[root@k8s-master ~]# yum install -y gcc && gcc -o zombie zombie.c
[root@k8s-master ~]# ./zombie 

 # 僵尸进程查询与消除

# top命令可以查询zombie进程数量
[root@k8s-master ~]# top | head -2
top - 16:18:48 up 34 min,  1 user,  load average: 0.11, 0.10, 0.13
Tasks: 116 total,   1 running, 114 sleeping,   0 stopped,   1 zombie

# ps查询具体状态为z的进程,5623为僵尸进程,5622为其父进程
[root@k8s-master ~]# ps -ef | grep defunct | grep -v grep
root       5623   5622  0 16:10 pts/0    00:00:00 [zombie] <defunct>

[root@k8s-master ~]# ps -A -ostat,ppid,pid,cmd | grep -e '^[Zz]'
Z      5622   5623 [zombie] <defunct>

# 消除僵尸进程

[root@k8s-master ~]# kill -9 5622
直接kill子进程ID,如果无效,kill父进程ID。
也可以写个脚本,这里不详说了。

2、http常见状态码讲解

类别    原因短语
1xx    Informational(信息性状态码)   接受的请求正在处理
2xx    Success(成功状态码)              请求正常处理完毕
3xx    Redirection(重定向)                 需要进行附加操作以完成请求
4xx    Client error(客户端错误)          客户端请求出错,服务器无法处理请求
5xx    Server Error(服务器错误)        服务器处理请求出错
200 OK:表示从客户端发送给服务器的请求被正常处理并返回;
403 Forbidden:服务器拒绝该次访问(访问权限出现问题);
404 Not Found:表示服务器上无法找到请求的资源;
500 Inter Server Error:表示服务器在执行请求时发生了错误,也有可能是web应用存在的bug或某些临时的错误时;

301与302
301和302状态码都表示重定向
301 redirect: 301 代表永久性转移(Permanently Moved)
302 redirect: 302 代表暂时性转移(Temporarily Moved)
实际情况尽量用301,原因是:
部分搜索引擎,尤其是Google,并不能总是抓取目标网址。而是根据搜索引擎的排名规则,而且302重定向很容易被搜索引擎误认为是利用多个域名指向同一网站,这就造成了网址URL劫持的可能性。那么你的网站就会被封掉。

503与504
503 服务不可用是的一种状态,那么在服务器503错误出现了之后,大家不必担心的, 服务器或许就是正在维护或者暂停了
504 这是代表着网关超时是现象出现了。504错误问题是一个不好办的问题,当然你必须尝试着和网站官方获得联系,认真的去检查不同的电脑简的ip传输的状况。而且这个504错误要专业的负责人才能去解决。

3、linux启动顺序

https://www.runoob.com/linux/linux-system-boot.html

4、TCP的三次握手与四次挥手

TCP/IP协议是传输层面向连接的,安全可靠的传输协议,三次握手机制是为了保证能建立一个安全可靠的连接。

 

第一次握手:建立连接时,客户端发送连接报文到服务器,其中SYN标志位为1,并生成随机序列号sep=10000,并进入SYN_SENT状态,等待服务器确认;
第二次握手:服务器收到syn包,回复客户端确认消息报文,ACK标志位为1,序列号为10000+1,同时自己也发送一个SYN包(SYN=1,seq=20000),此时服务器进入SYN_RECV状态;
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认消息报文,ACK=1,ack=20000+1,此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手。
请注意:10000和20000都是随机模拟的数字。

 

1)客户端进程发出连接释放报文,并且停止发送数据。释放数据报文首部,FIN=1,其序列号为seq=u(等于前面已经传送过来的数据的最后一个字节的序号加1),此时,客户端进入FIN-WAIT-1(终止等待1)状态。 TCP规定,FIN报文段即使不携带数据,也要消耗一个序号。
2)服务器收到连接释放报文,发出确认报文,ACK=1,ack=u+1,并且带上自己的序列号seq=v,此时,服务端就进入了CLOSE-WAIT(关闭等待)状态。TCP服务器通知高层的应用进程,客户端向服务器的方向就释放了,这时候处于半关闭状态,即客户端已经没有数据要发送了,但是服务器若发送数据,客户端依然要接受。这个状态还要持续一段时间,也就是整个CLOSE-WAIT状态持续的时间。
3)客户端收到服务器的确认请求后,此时,客户端就进入FIN-WAIT-2(终止等待2)状态,等待服务器发送连接释放报文(在这之前还需要接受服务器发送的最后的数据)。
4)服务器将最后的数据发送完毕后,就向客户端发送连接释放报文,FIN=1,ack=u+1,由于在半关闭状态,服务器很可能又发送了一些数据,假定此时的序列号为seq=w,此时,服务器就进入了LAST-ACK(最后确认)状态,等待客户端的确认。
5)客户端收到服务器的连接释放报文后,必须发出确认,ACK=1,ack=w+1,而自己的序列号是seq=u+1,此时,客户端就进入了TIME-WAIT(时间等待)状态。注意此时TCP连接还没有释放,必须经过2∗∗MSL(最长报文段寿命)的时间后,当客户端撤销相应的TCB后,才进入CLOSED状态。
6)服务器只要收到了客户端发出的确认,立即进入CLOSED状态。同样,撤销TCB后,就结束了这次的TCP连接。可以看到,服务器结束TCP连接的时间要比客户端早一些。

参考:
https://www.bilibili.com/video/BV1bi4y1x7m5
https://www.cnblogs.com/bj-mr-li/p/11106390.html

5、如果docker容器挂掉怎么办

1、docker ps -a | grep $podName

2、docker logs --tail=100 <container-id>|<contianer-name>

3、docker top <container-id>|<contianer-name>

4、docker exec -ti <container-id>|<contianer-name> bash

5、docker stats <container-id>|<contianer-name>

思路:

1、通过查看logs

2、/usr/sbin/init初始化

https://blog.csdn.net/Coder__CS/article/details/80801321



6、sed、awk截取ip、空行等

查看空行

[root@host ~]# grep -n '^$' data           

[root@host ~]# awk '/^$/{print NR}' data   

[root@host ~]# sed -n '/^$/='  data      

去除空行

[root@linux-node1 ~]# grep -v '^\s*$' 1.txt

[root@linux-node1 ~]# sed '/^\s*$/d' 1.txt

[root@linux-node1 ~]# awk NF 1.txt

删除空行

[root@linux-node1 ~]# sed -i '/^[ \t]*$/d' 1.txt

截取ip地址

ifconfig | grep 'inet'| grep -v '127.0.0.1' | cut -d: -f2 | awk '{print $2}'

7、nginx高可用负载均衡实现原理

LVS等负载均衡是转发用户请求的数据包,而Nginx反向代理是接收用户请求后重新发起请求后端节点。

nginx负载:

https://www.jianshu.com/p/dbd02a4b0f26

原理:主配置location /不是直接访问web而是调用upstream server方法,upstream里面配置从信息

upstream server1 {

          server  192.168.192.129:80 weight=1;

          server  192.168.192.130:80 weight=1;

    }

location / {

        proxy_pass  http://server1;

    }

nginx高可用:

https://blog.csdn.net/qq_34021712/article/details/73438100

原理:
keepalived可以认为是VRRP协议在Linux上的实现,主要有三个模块,分别是core、check和vrrp。core模块为keepalived的核心,负责主进程的启动、维护以及全局配置文件的加载和解析。check负责健康检查,包括常见的各种检查方式。vrrp模块是来实现VRRP协议的。

VRRP协议:
VRRP全称 Virtual Router Redundancy Protocol,即 虚拟路由冗余协议。可以认为它是实现路由器高可用的容错协议,即将N台提供相同功能的路由器组成一个路由器组(RouterGroup),这个组里面有一个master和多个backup,但在外界看来就像一台一样,构成虚拟路由器,拥有一个虚拟IP(vip,也就是路由器所在局域网内其他机器的默认路由),占有这个IP的master实际负责ARP相应和转发IP数据包,组中的其它路由器作为备份的角色处于待命状态。master会发组播消息,当backup在超时时间内收不到vrrp包时就认为master宕掉了,这时就需要根据VRRP的优先级来选举一个backup当master,保证路由器的高可用。


vrrp_script check_haproxy { 

script "/etc/keepalived/nginx_check.sh"  #检测 nginx 状态的脚本路径

interval 2  #检测时间间隔

weight -20  #条件成立 权重减20 。。。 }

vrrp_instance VI_1 {   

    state MASTER   

    interface eth0         

    mcast_src_ip 192.168.139.130 

    virtual_router_id 51 。。。}

8、MySQL主从原理

 

参考:https://segmentfault.com/a/1190000019373762

Guess you like

Origin blog.csdn.net/weixin_39855998/article/details/107516214