运维面试题01

网络相关

tcp三次握手,四次挥手

三次握手(TCP 连接建立)

  1. SYN :客户端发送 SYN(seq=x)请求建立连接。

  2. SYN-ACK :服务器回复 SYN-ACK(seq=y,ack=x+1),表示同意连接。

  3. ACK :客户端发送 ACK(ack=y+1),连接建立。

目的:确保双方具备发送和接收能力,防止历史连接干扰。


四次挥手(TCP 连接断开)

  1. 客户端发送 FIN,请求断开连接,关闭客户端到服务端的数据传送,客户端进入 FIN_WAIT_1 状态。

  2. 服务器回复 ACK,服务端进入 CLOSE_WAIT 状态。但仍可能有数据未发送完。

  3. 服务器发送 FIN,关闭服务端到客户端的数据传送,服务端进入 LAST_ACK 状态,表示数据传输完毕。

  4. 客户端收到 FIN 后进入 TIME_WAIT 状态,发送 ACK 给服务端,服务端进入CLOSED 状态,至此完成四次握手。

TIME-WAIT 状态是为了确保客户端发送的 ACK 确实到达服务器,并且防止之前的连接数据包在网络中滞留,可能会影响未来的连接

服务器出现了大量TIME_WAIT状态如何检测和解决

1.检测其数量和信息:

复制代码
netstat -an | grep TIME_WAIT 

2.查看是否端口耗尽(短时间内连接数太多)

复制代码
ss -n | awk '/^tcp/ {++s[$1]} END {for(k in s) print k, s[k]}'

3.确认是否是客户端主动断开连接

tcpdump 抓包,查看 FIN、ACK 等行为,定位连接关闭一方

4.检查系统资源限制

复制代码
ulimit -n              # 当前最大打开文件数
cat /proc/sys/net/ipv4/ip_local_port_range  # 本地可用端口范围

常见解决方案

.1 修改服务器内核参数

复制代码
net.ipv4.tcp_tw_reuse = 1 #表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭;
net.ipv4.tcp_tw_recycle = 1      # 表示开启TCP连接中TIME-WAIT sockets的快速回收。
net.ipv4.tcp_fin_timeout = 10    # 缩短 FIN_WAIT 超时时间
net.ipv4.ip_local_port_range = 1024 65000  # 扩大可用端口范围

2.提高资源限制:

复制代码
ulimit -n 65535  # 临时提高最大文件句柄数,防止资源耗尽

3.优化业务侧逻辑:

  • 避免频繁创建短连接,尽可能使用 长连接池

  • 对于客户端频繁主动断开连接的情况,考虑连接重用或引入 连接代理(如 Nginx)

4.使用四层负载均衡(如 LVS):

LVS 属于内核态转发,性能极高,避免了中间件层产生大量连接。

讲一下ospf协议

  • 特点:基于链路状态算法,收敛快,无自环,支持层次化网络,使用区域划分。

  • 类型:链路状态路由协议

  • 工作原理

    • 发现邻居:Hello 包建立和维护邻居关系。

    • 链路状态信息交换:用 DD、LSR、LSU、LSAck 交换链路状态。

    • 构建拓扑图:收集信息形成 LSDB,构建最短路径树。

    • 计算路由:用 SPF 算法算最佳路径。

  • 应用场景:大型企业网、数据中心网络。

R1\] ospf 1 # 创建 OSPF 实例 1 \[R1-ospf-1\] area 0 # 使用 area 0 \[R1-ospf-1-area-0.0.0.0\] network 10.0.12.0 0.0.0.255 # 宣告直连网段 display ospf peer #看邻居表 display ip routing-table #看路由表 ### 服务器 linux相关的 #### 常见端口: 1. **22 (SSH)** * **用途**:安全远程登录到服务器。 * **命令检查** :`ss -tulnp | grep :22` 或 `netstat -tulnp | grep :22` 1. **80 (HTTP)** * **用途**:Web 服务器使用的默认端口,用于未加密的 HTTP 通信(如 Nginx、Apache)。 * **命令检查** :`curl -I http://your-server-ip` 1. **443 (HTTPS)** * **用途**:安全 HTTP 通信,使用 SSL/TLS 加密的 Web 服务器(如 Nginx、Apache)。 * **命令检查** :`curl -I https://your-server-ip` 1. **3306 (MySQL)** * **用途**:MySQL 数据库默认监听端口。 * **命令检查** :`mysql -u root -p -h 127.0.0.1 -P 3306` 1. **5432 (PostgreSQL)** * **用途**:PostgreSQL 数据库默认监听端口。 * **命令检查** :`pg_isready -h localhost -p 5432` 1. **6379 (Redis)** * **用途**:Redis 内存数据库的默认端口。 * **命令检查** :`redis-cli -h localhost -p 6379 ping` 1. **8080 (常用于 Web 应用)** * **用途**:备用 Web 服务器端口,Tomcat、Jenkins 等常用。 * **命令检查** :`curl -I http://your-server-ip:8080` 1. **8443 (HTTPS 备用端口)** * **用途** :Tomcat、Spring Boot 应用的 HTTPS **端口**。 * **命令检查** :`curl -I https://your-server-ip:8443` 1. **25 (SMTP)** * **用途**:邮件传输协议(SMTP),用于发送邮件。 * **命令检查** :`telnet smtp.example.com 25` 1. **53 (DNS)** * **用途**:DNS 解析服务(如 BIND)。 * **命令检查** :`nslookup google.com 8.8.8.8` #### **谈谈进程,线程,协程** **协程** 不是进程也不是线程,而是一个**特殊的函数**,这个函数可以在某个地方挂起,并且可以重新在挂起处外继续运行。所以说,协程与进程、线程相比并不是一个维度的概念。 一个进程可以包含多个线程,一个线程也可以包含多个协程。简单来说,一个线程内可以由多个这样的特殊函数在运行,但是有一点必须明确的是,一个线程的多个协程的运行是串行的 **进程**是资源分配的基本单位,一个进程拥有自己的内存空间、文件描述符等。如大型后台服务 **线程**是程序执行的最小单位,一个进程可以包含多个线程。线程之间共享进程的资源,因此比进程更轻量。用于需要共享资源和高效并发的任务,如计算密集型或多任务的程序 **协程**并不是操作系统级的线程或进程,而是由程序内部实现的轻量级线程,作用与I/O密集型任务,如网络请求、爬虫和异步数据处理。 #### **为何du和df统计结果不一致?** 用户删除了大量的文件被删除后,在文件系统目录中已经不可见了,所以du就不会再统计它。 然而如果此时还有运行的进程持有这个已经被删除的文件句柄,那么这个文件就不会真正在磁盘中被删除,分区超级块中的信息也就不会更改,df仍会统计这个被删除的文件。 可通过 lsof命令查询处于deleted状态的文件,被删除的文件在系统中被标记为deleted。如果系统有大量deleted状态的文件,会导致du和df统计结果不一致。 #### **swap分区的作用** swap分区是一个交换分区,当物理内存不足时, swap分区会释放一部分内存给当前正在运 行的程序使用。这部分空间一般来自那些很长时间没有运行过的程序,系统将这部分空间 临时存放在swap空间中,给那些内存占有率比较高的程序使用。 #### **遇到磁盘空间不足的报错 , 你应该如何处理** 可能一: 使用 df -h 命令查看磁盘空间的使用情况,确定哪个目录占用的磁盘空间过高 确定目录后,使用 du -h 命令进行逐级定位,确认到占用空间最大的大文件 查看文件内容,确认一下是否需要保留,如果需要保留就通过压缩导出,不需要保 留可以直接删除,或者对磁盘进行扩容 或者可以直接使用 find 命令查找目录下大于400MB的文件名称,然后进行删除 fi nd 目录 -size +400M 可能二: 使用 df -h 命令并不能发现大文件,那么可能是文件被删除,但是进程仍然在调用 这个文件 此时可以通过 lsof \| grep delete ,找到占用的进程,把这个进程kill掉然后重启 服务器即可 #### **服务器系统日志放在哪里** /var/log/message :系统启动后的信息和错误日志 /var/log/security :与系统安全相关的日志 /var/log/maillog :与系统邮件相关的日志 /var/log/cron :与定时计划任务相关的日志 /var/log/boot.log \& /var/log/dmesg :与系统启动相关的日志 **说 一 下Nginx做反向代理时常用的算法有哪些** · rr :轮询算法,将用户的请求平均的分配到后台的服务器上,如果后台服务器宕机,会 自动将宕机服务器清除 · wrr :加权轮询,根据权重分配请求,权重越大,处理的请求的越多 · ip_hash:根据请求的hash值进行分配, hash值相同的会被分配到同一台机器上 fair:根据后台服务器的响应时间进行分配,响应时间短的优先分配,必须下载nginx的 upstream_fair模块才能使用 · least_conn:哪台服务器的连接数最少,就分配到那台服务器上 ### 数据库 #### **MySQL数据库的备份方式** · 增量备份 · 异地备份 · 重要的数据库会在设计架构时,搭建一个一摸一样的数据库做完整备份 · 通过命令行备份: mysqldump -uroot -p 数据库名 \> \*.sql文件 · 通过Rsync+Inotify进行冷备 · 设计架构时,会搭建数据库的集群,进行热备 #### **数据库常用的引擎有什么 , 说 一 下区别** MYISAM:性能优异,查询速度快;但是不支持事务、锁、外键约束等高级功能 INNODB:支持事务、锁、外键约束等高级功能 MEMORY:将数据储存在内存中,方便快速读写 #### **在数据库查询中,发现查询速度变慢,你如何定位和处理** --第一时间排查是否是全局资源瓶颈导致的,使用 `top` / `htop` / `vmstat` 查看服务器负载、内存、IO 等; --不是的话定位到数据库相关,对慢查询日志分析( less /var/log/mysql/mysql-slow.log\*\*)观察是否存在锁等待(show enging innodb status;) 查看当前活跃连接和 SQL 执行情况(show processlist;) 用explain select 检查是否使用了索引、是否全表扫描、是否 JOIN 不当等。 **加索引** :如果 EXPLAIN 显示没有使用索引,会考虑在 `WHERE`、`JOIN` 或排序字段上加合适索引; **SQL 改写** :避免使用 `SELECT *`,拆分过于复杂的大 SQL,减少嵌套子查询; **减少数据量**:增加 LIMIT 分页、按需加载、或使用物化视图; **调整 MySQL 参数** :如 `innodb_buffer_pool_size`、`query_cache_size`、`tmp_table_size` 等; **拆库分表 / 读写分离 / 缓存引入**:如果是架构性瓶颈,考虑提升读写能力。 #### **MySQL为什么会出现锁表的情况 , 怎么解锁 , 如何避免这种情况的出现锁** 高并发情况下造成的io拥堵 数据主从同步失败 使用命令进行锁表: lock · 解锁: unlock · 增加数据库的缓存可以避免锁表的情况出现

相关推荐
努力学习的小廉2 小时前
深入了解linux系统—— 进程池
linux·运维·服务器
秃头菜狗3 小时前
各个主要目录的功能 / Linux 常见指令
linux·运维·服务器
jiunian_cn4 小时前
【Linux】centos软件安装
linux·运维·centos
藥瓿亭4 小时前
K8S认证|CKS题库+答案| 6. 创建 Secret
运维·ubuntu·docker·云原生·容器·kubernetes·cks
2302_809798324 小时前
【JavaWeb】Docker项目部署
java·运维·后端·青少年编程·docker·容器
嵌入式大圣4 小时前
Neko虚拟浏览器远程协作方案:Docker+内网穿透技术部署实践
运维·docker·容器
dmy5 小时前
n8n内网快速部署
运维·人工智能·程序员
程序员JerrySUN5 小时前
全面理解 Linux 内核性能问题:分类、实战与调优策略
java·linux·运维·服务器·单片机
米粉03055 小时前
深入剖析Nginx:从入门到高并发架构实战
java·运维·nginx·架构
huangyuchi.6 小时前
【Linux】LInux下第一个程序:进度条
linux·运维·服务器·笔记·进度条·c/c++