Skip to content

本轮 服务器运维面试题库(带答案)

【面试题】1. Nginx的upstream健康检查有哪几种方式?生产环境推荐哪种? ​

【标准答案】Nginx原生支持被动健康检查,也就是max_fails和fail_timeout参数,当后端失败次数达到max_fails后,在fail_timeout时间内不再把请求转发给该节点。这种方式的问题是只有请求过来才知道后端挂了,存在用户感知。生产环境推荐用nginx_upstream_check_module做主动健康检查,它能定时向后端发心跳探测(支持TCP/HTTP),后端一挂立即从池子摘除,用户无感知。配置上加上check interval=3000 rise=2 fall=3 timeout=1000 type=http,3秒一次探测,连续2次成功恢复,连续3次失败摘除。另外Tengine也内置了主动健康检查,用阿里系的同学可以直接用。

【面试题】2. Linux中load average的三个数值分别代表什么?什么情况下需要报警? ​

【标准答案】load average显示三个数,分别是1分钟、5分钟、15分钟内的平均负载,代表的是系统中处于可运行状态(R)和不可中断睡眠状态(D)的进程数之和。注意它不是CPU使用率。比如4核机器load到4,说明每个核都满负荷,这是正常的;但如果是单核机器load到4,说明有3个进程在排队等CPU。D状态通常是等IO,所以load高但CPU使用率低,大概率是磁盘IO瓶颈。报警阈值一般设为核数的2倍,比如8核机器load持续超过16就要关注了。判断时要结合CPU使用率和iowait一起看,三者联动才能定位根因。

【面试题】3. Tomcat的NIO Connector和APR Connector有什么区别?生产环境怎么选? ​

【标准答案】NIO Connector基于Java NIO实现,用少量线程处理大量连接,通过Selector多路复用,适合长连接多、并发高的场景。APR Connector底层调用Apache Portable Runtime的native库,用C实现的,性能更好,特别是在SSL处理和静态文件上优势明显,但需要额外安装APR和Tomcat Native库。Tomcat 8.5+默认用NIO,开箱即用。生产环境选型建议:如果主要跑Spring Boot内嵌Tomcat,NIO就够了,别折腾APR;如果是独立部署的Tomcat且SSL流量大,装APR能提升20%-30%的SSL性能。另外Tomcat 9引入了NIO2(异步IO),理论上性能更好但实际提升有限,目前NIO还是最稳的选择。

【面试题】4. 如何排查Nginx 502 Bad Gateway错误?给出完整排查思路。 ​

【标准答案】502说明Nginx能正常工作,但后端服务挂了或不可达。排查分四步走:第一步,看Nginx错误日志error.log,找"upstream prematurely closed connection"或"connect refused"等关键字,确认是哪个后端节点出问题。第二步,检查后端服务是否存活,ps看进程、netstat看端口、curl直接请求后端验证。第三步,如果后端活着但还502,检查是否是超时导致的,看proxy_read_timeout和后端响应时间是否匹配,Java应用Full GC时可能卡住超过60秒。第四步,如果后端完全正常,检查是不是Nginx和后端之间的网络问题,防火墙、SELinux、或者upstream端口写错了。常见原因排序:后端挂了>后端Full GC>超时配置不合理>网络/防火墙。

【面试题】5. iptables和firewalld有什么区别?CentOS 7+为什么默认用firewalld? ​

【标准答案】iptables是最经典的Linux防火墙,直接操作内核的netfilter,规则按顺序匹配,写法灵活但规则多了性能下降且管理复杂。firewalld是CentOS 7引入的新防火墙管理工具,底层其实还是调netfilter(可以用iptables-backend也可以用nftables-backend),它的核心改进是引入了"zone"概念和"服务"抽象,不用记端口号,直接firewall-cmd --add-service=http就行。另外firewalld支持运行时规则和持久化规则分离,改了不会立即生效到重启,更安全。最大的好处是动态更新规则不用像iptables那样全部刷一遍重载,对Docker/K8s这种频繁改规则的场景友好。生产建议用firewalld,除非你有大量存量iptables脚本需要兼容。

【面试题】6. Keepalived+Nginx高可用方案中,脑裂问题怎么解决? ​

【标准答案】脑裂就是两台机器都认为自己是MASTER,各持一个VIP,导致流量混乱。根因是主备之间的心跳线断了但双方都还活着。解决方案分几层:第一,物理层冗余,用两条独立心跳线(比如一根直连网线+一根业务网线),vrrp_instance配两个unicast_peer。第二,脚本层检测,写一个check脚本,通过arping或者直接curl网关来确认VIP是否真的在自己身上,如果发现VIP在对方机器也起来了,主动降级或关keepalived。第三,结合fencing,检测到脑裂时通过IPMI或SSH远程关掉对方的keepalived进程,确保只有一个MASTER。第四,监控告警,用Prometheus监控keepalived状态,同一时间出现两个MASTER立即报警。生产最实用的就是双心跳线+检测脚本,成本最低效果最好。

【面试题】7. Docker容器资源限制怎么配?一个Java应用容器推荐怎么设置? ​

【标准答案】Docker通过cgroups做资源限制,核心参数三个:-m或--memory限制内存,--cpus限制CPU核数,--memory-swap限制内存+swap。Java应用容器要注意一个巨坑:JVM默认堆大小是基于宿主机内存算的,不是容器内存。比如容器限2G但宿主机64G,JVM可能默认堆就分配了16G,直接被OOM Kill。解决方式:JDK 8u191+和JDK 11+支持-XX:+UseContainerSupport(默认开启),JVM会感知容器限制。推荐配置:容器内存4G,JVM堆设-Xms2g -Xmx2g,留一半给元空间、线程栈、直接内存等。CPU方面,--cpus=2限制2核,JVM的GC线程数会自动适配。另外一定要配--memory-swap等于--memory,禁止容器用swap,Java应用用swap会频繁Full GC,性能断崖式下跌。

【面试题】8. Prometheus的Pull模型和Zabbix的Push模型各有什么优劣势? ​

【标准答案】Prometheus是Pull模型,服务端主动去拉取目标的/metrics接口,好处是服务端掌握主动权,目标挂了能立即发现(scrape失败),而且目标不需要配置推送地址,新增目标只需要在Prometheus加配置就行,天然适合云原生和动态扩缩容场景。劣势是跨网络拉取需要打通网络或者用Pushgateway中转,大规模目标时服务端压力较大。Zabbix是Push+Pull混合但以Agent Push为主,Agent主动向Server上报数据,好处是目标在NAT后面也能监控,不用开端口,适合传统IDC和复杂网络。劣势是目标挂了Agent也停了,Server收不到数据要等超时才知道。选型建议:K8s环境用Prometheus,传统机房用Zabbix,混合环境用Thanos或者VMagent统一采集。

【面试题】9. 如何用sysctl调优Linux TCP参数来支撑高并发? ​

【标准答案】核心参数有这么几个:net.ipv4.tcp_tw_reuse=1,允许将TIME_WAIT状态的连接重新用于新的TCP连接,短连接多的场景必开。net.core.somaxconn=65535,增加全连接队列大小,避免高并发时SYN已确认但accept队列满了导致连接被拒绝。net.ipv4.tcp_max_syn_backlog=65535,增大半连接队列,防SYN Flood同时提升并发。net.ipv4.tcp_fin_timeout=15,缩短FIN_WAIT_2超时时间,默认60秒太长。net.ipv4.ip_local_port_range=1024 65535,扩大临时端口范围,客户端短连接场景必须扩大。net.ipv4.tcp_keepalive_time=600,缩短TCP保活探测时间,及时清理死连接。net.core.rmem_max和wmem_max调大TCP读写缓冲区,大流量场景提升吞吐。这些参数写在/etc/sysctl.conf里然后sysctl -p生效。注意不要开tcp_tw_recycle,在NAT环境下会导致连接失败,这个参数在4.12内核已经被移除了。

【面试题】10. LVS的NAT模式和DR模式有什么区别?生产环境怎么选? ​

【标准答案】NAT模式下,客户端请求到LVS的VIP,LVS修改目标IP转发给RealServer,RealServer响应回LVS,LVS再改源IP回客户端。请求和响应都经过LVS,所以LVS会成为瓶颈,但RealServer不需要任何特殊配置,只要网关指向LVS就行。DR模式下,LVS只修改MAC层地址,把请求直接转发给RealServer,RealServer响应直接回客户端,不经过LVS。响应不经过LVS所以性能好,能扛住极高并发。但DR模式要求RealServer上也要配置VIP(用lo口的VIP做ARP抑制),网络配置更复杂。生产选型:响应流量大(视频、下载)用DR模式,让响应绕开LVS;内部服务、对网络配置要求简单的用NAT模式。另外还有TUN模式适合跨机房,但需要IP隧道支持,实际用得少。DR模式是互联网公司最常用的方案,Nginx/HAProxy做四层七层代理,LVS DR做最前端的四层负载。