2024-04-17 面试总结

1.查看主机的硬件信息的命令 包括cpu 网卡 显卡这些
2.查看cpu负载情况 load的数值的含义
3.优化做过哪些?内核参数优化,具体讲下
4.nginx上的服务访问不通 怎么排查
5.502和504的区别
6.k8s的组件有哪些
7.kubelet和kube-proxy在主节点上会跑吗
8.k8s的网络插件用过哪些,calico的BGP模式讲下

1.查看主机的硬件信息的命令 包括cpu 网卡 显卡这些

CPU信息:

在终端输入:lscpu
显卡信息:
cat /etc/cpuinfo 或 cat /proc/cpuinfo

使用命令:lspci | grep VGA (通常用于PCIe接口的显卡)
或者 lshw -c display 获取更详细的显卡信息
网卡信息:

使用命令:lspci | grep Ethernet (对于PCIe接口的网卡)
或者 ifconfig -a 或 ip addr show 查看网络接口及其IP配置
若要获取更详细的硬件信息,可以使用 ethtool -i [interface_name],其中 [interface_name] 是你想要查询的网卡名称。

2.查看cpu负载情况 load的数值的含义

12:34:56 up 1 day, 3:23,  3 users,  load average: 0.23, 0.25, 0.28

其中,“load average”后面的三个数字分别表示过去1分钟、5分钟和15分钟的平均负载。这些数值表示的是在这段时间内,系统中处于运行(包括正在运行和等待运行)状态的平均进程数(或线程数)。

负载数值的含义:

单核CPU情况下,当负载平均值为1.0时,意味着CPU在这段时间里一直忙于处理进程,没有闲置时间,达到了理论上的满载状态。
多核CPU环境中,负载平均值应当参照CPU核心数量。例如,对于一个8核CPU来说,理想的负载应该低于8.0,即所有核心都被充分利用且无进程等待。不过,实际上,由于进程并非总是能够完全并行处理,所以理想的负载水平往往低于实际核心数,一般认为是核心数的0.7倍左右较为健康。
解读负载值:

负载值小于1表明系统整体上是轻载的,CPU有足够的处理能力和时间处理新的请求。
负载值接近或超过CPU核心数,意味着系统可能正面临资源瓶颈,有较多的进程在等待CPU时间片分配,可能会出现性能下降或响应延迟。
长时间持续较高的负载可能意味着系统配置不足或者有进程出现了性能问题,需要进一步排查优化。

3.优化做过哪些?内核参数优化,具体讲下

内核参数优化是Linux系统管理员进行系统性能调优的重要手段之一,主要目的是为了让内核更好地适应特定的应用场景和硬件环境,从而提升系统性能、稳定性和安全性。下面是一些具体的内核参数优化方向和实例:

1. 处理器调度相关参数
kernel.sched_migration_cost_ns: 进程迁移成本,影响CPU亲和性策略下的任务调度决策。
kernel.sched_child_runs_first: 控制子进程是否优先执行,对于某些实时性要求高的应用程序可能需要调整。
kernel.sched_min_granularity_ns 和 kernel.sched_latency_ns: 定义调度器最小粒度和目标延迟,影响任务切换频率。
2. 内存管理参数
vm.swappiness: 控制系统在物理内存不足时多快地开始交换内存页到磁盘。较小的值倾向于保持更多的内存数据不被换出。
vm.dirty_ratio 和 vm.dirty_background_ratio: 控制内核脏页缓存的比例,影响I/O性能和数据同步策略。
3. 文件系统和I/O相关参数
fs.file-max: 系统允许的最大同时打开文件描述符数量,对高并发服务如数据库和Web服务器尤其重要。
vm.max_map_count: 最大可映射区域数量,对于Elasticsearch等依赖大量内存映射的应用很重要。
fs.inotify.max_user_watches, fs.inotify.max_queued_events 和 fs.inotify.max_user_instances: 优化inotify事件监听机制,对需要监控大量文件变化的应用有用。
4. 网络栈相关参数
net.ipv4.tcp_syncookies: 控制是否启用SYN Cookies,有助于缓解SYN洪泛攻击。
net.ipv4.tcp_max_tw_buckets: 控制TIME_WAIT状态连接的最大数量,对高并发短连接场景进行优化。
net.core.somaxconn: 套接字监听队列的最大长度,影响服务器接受新连接的能力。
5. TCP/IP参数
net.ipv4.tcp_keepalive_time: TCP连接保持活动探测的时间间隔。
net.ipv4.tcp_fin_timeout 和 net.ipv4.tcp_syn_retries: 控制TCP连接关闭和建立过程中的超时次数。
net.ipv4.tcp_window_scaling 和 net.ipv4.tcp_timestamps: 开启TCP窗口缩放和时间戳选项,有利于提高带宽利用率。
6. 其他性能和安全相关参数
kernel.pid_max: 系统允许的最大PID数量。
kernel.shmmax 和 kernel.shmall: 控制共享内存段的最大大小和页数,对依赖共享内存的应用有意义。
进行内核参数优化时,需结合实际应用场景分析系统瓶颈,不应盲目调整,否则可能导致系统不稳定或无法达到预期效果。调整后,通常会通过sysctl命令动态修改,并持久化至/etc/sysctl.conf文件中,确保重启后依然生效。对于某些关键系统服务,还应配合工具如systemd-tuned或sysctl.d目录下的配置文件进行更加精细化的调优。









#modify the value of  kernel.shmmax
sed -i  's/kernel\.shmmax/#kernel\.shmmax/'  /etc/sysctl.conf
sed -i  "/#kernel\.shmmax/a \kernel.shmmax = $half_mem" /etc/sysctl.conf
echo "kernel.shmmax = $half_mem"  >> /etc/sysctl.conf
echo "kernel.shmall = 2097152"  >> /etc/sysctl.conf
echo "kernel.pid_max = 65535"  >> /etc/sysctl.conf
echo "net.ipv4.neigh.default.gc_thresh1 = 4096"  >> /etc/sysctl.conf
echo "net.ipv4.neigh.default.gc_thresh2 = 8192"  >> /etc/sysctl.conf
echo "net.ipv4.neigh.default.gc_thresh3 = 8192"  >> /etc/sysctl.conf
echo "kernel.shmmni = 4096"                             >>/etc/sysctl.conf
echo "kernel.sem = 250 32000 100 128"           >>/etc/sysctl.conf
echo "kernel.shmmni = 4096"                             >>/etc/sysctl.conf
echo "kernel.sem = 250 32000 100 128"           >>/etc/sysctl.conf
#set the other kernel parameters as follows:
echo "fs.aio-max-nr = 1048576"                  >> /etc/sysctl.conf
echo "fs.file-max = 6815744"                    >>/etc/sysctl.conf
echo "net.ipv4.ip_local_port_range = 9000 65500">>/etc/sysctl.conf
echo "net.core.rmem_default = 262144"   >>/etc/sysctl.conf
echo "net.core.rmem_max = 4194304"              >>/etc/sysctl.conf
echo "net.core.wmem_default = 262144"   >>/etc/sysctl.conf
echo "net.core.wmem_max = 1048586"              >>/etc/sysctl.conf
echo "net.ipv4.ip_forward=1"              >>/etc/sysctl.conf
echo "net.bridge.bridge-nf-call-iptables=1" >>/etc/sysctl.conf
echo "net.bridge.bridge-nf-call-ip6tables=1" >>/etc/sysctl.conf





这段脚本是对Linux系统内核参数进行设置,通过修改/etc/sysctl.conf文件,使得重启后这些参数也能生效。以下是各项参数的含义:

sed -i 's/kernel.shmmax/#kernel.shmmax/' /etc/sysctl.conf:注释掉原有的kernel.shmmax配置项。shmmax是系统允许单个共享内存段的最大大小(单位通常是KB)。如果之前已存在该配置,则将其注释掉以便重新定义。

sed -i "/#kernel.shmmax/a \kernel.shmmax = $half_mem" /etc/sysctl.conf:在注释后的同一行添加新的kernel.shmmax配置,其值等于变量$half_mem,假设这个变量存储了系统一半的内存大小作为共享内存最大值。

后续的echo语句都是向/etc/sysctl.conf追加新的配置项:

kernel.shmall:决定系统范围内共享内存页面的数量,这里的值设为2097152。

kernel.pid_max:系统支持的最大进程ID数,设为65535。

net.ipv4.neigh.default.gc_thresh1,gc_thresh2和gc_thresh3:IPv4邻居表条目的垃圾回收阈值,分别设定为4096,8192和8192,用于控制ARP高速缓存表的清理策略。

kernel.shmmni:系统范围内共享内存段的最大数目,设为4096。

kernel.sem:信号量的四个参数,分别为SEMMSL(每个信号量集合中信号量的最大数目)、SEMMNS(系统范围内的信号量最大数目)、SEMOPM(单个semop系统调用中操作数的最大数目)、SEMMNI(信号量集合的最大数目),这里设为250, 32000, 100, 128。

fs.aio-max-nr:异步I/O挂起操作的最大数量,设为1048576。

fs.file-max:系统允许的最大文件句柄数,设为6815744。

net.ipv4.ip_local_port_range:本地端口范围,用于向外发起连接时可用的源端口范围,设为9000到65500。

net.core.rmem_default和net.core.rmem_max:接收缓冲区默认大小和最大大小,单位字节,分别设为262144和4194304。

net.core.wmem_default和net.core.wmem_max:发送缓冲区默认大小和最大大小,单位字节,分别设为262144和1048586。

net.ipv4.ip_forward:开启IP转发功能,设为1,表示允许本机做为路由器进行IP包转发。

net.bridge.bridge-nf-call-iptables和net.bridge.bridge-nf-call-ip6tables:允许在桥接模式下应用iptables规则,这对于虚拟化环境和容器环境中的网络过滤十分重要。

以上参数的设置需要根据实际系统需求和应用场景进行合理配置,过大的值可能会浪费系统资源,而过小的值则可能导致性能瓶颈。

4.nginx上的服务访问不通 怎么排查

如果 Nginx 上的服务无法访问,可能有多个原因,导致请求无法成功到达或响应。下面是一些常见的排查步骤,帮助你找出并解决问题。

1. 检查 Nginx 配置文件 #

首先,确认 Nginx 配置是否正确,常见的问题包括端口未正确绑定、server_name 设置不正确、反向代理配置错误等。

(1)检查 Nginx 配置文件 #

Nginx 的默认配置文件通常位于 /etc/nginx/nginx.conf/etc/nginx/sites-available/default(具体路径取决于你的操作系统和安装方式)。确保配置文件中没有语法错误。

你可以运行以下命令来检查 Nginx 配置文件的语法:

sudo nginx -t

如果有错误,Nginx 会给出详细的错误信息。解决配置问题后,重新加载配置:

sudo systemctl reload nginx

(2)检查 server_name 和监听端口 #

确保你的配置文件中有正确的 server_name(即域名或 IP 地址)和端口号。例如:

server {
    listen 80;
    server_name example.com;  # 确保这个地址是正确的
    location / {
        proxy_pass http://127.0.0.1:3000;  # 正确设置代理的目标服务
    }
}

(3)检查代理服务配置 #

如果 Nginx 作为反向代理,确保代理目标服务的地址和端口正确,且服务正在运行。


2. 检查防火墙设置 #

防火墙设置可能阻止外部访问 Nginx 或应用服务的端口。

(1)检查 Nginx 端口是否开放 #

确保防火墙允许通过 Nginx 使用的端口(通常是 80 和 443)。

  • 对于

    ufw

    防火墙:

    sudo ufw allow 'Nginx Full'
    sudo ufw enable
    
  • 对于

    firewalld

    sudo firewall-cmd --permanent --add-service=http
    sudo firewall-cmd --permanent --add-service=https
    sudo firewall-cmd --reload
    

(2)检查端口是否被占用 #

运行以下命令检查 Nginx 是否在监听指定的端口:

sudo netstat -tulnp | grep nginx

或者使用:

sudo ss -tulnp | grep nginx

3. 检查应用服务是否运行 #

如果 Nginx 配置了反向代理,确保目标应用服务正在运行。

(1)检查应用服务 #

检查应用程序(如 Node.js、Python 等)是否在指定端口上运行。例如,对于 Node.js,可以运行:

ps aux | grep node

或者检查应用服务的状态:

sudo systemctl status <your-app-service>

(2)检查应用日志 #

查看应用服务的日志,确保没有报错。应用的日志文件路径通常在配置文件中指定,常见的日志文件包括:

  • /var/log/nginx/access.log
  • /var/log/nginx/error.log
  • 应用的日志文件(如 /var/log/myapp.log

4. 检查 Nginx 和应用服务的日志 #

查看 Nginx 错误日志可以帮助定位访问问题。

(1)查看 Nginx 错误日志 #

Nginx 错误日志通常位于 /var/log/nginx/error.log。查看日志中是否有任何明显的错误信息,例如连接超时、权限问题等:

sudo tail -f /var/log/nginx/error.log

(2)查看 Nginx 访问日志 #

访问日志可以帮助你确认请求是否成功到达 Nginx,以及是否成功被处理:

sudo tail -f /var/log/nginx/access.log

5. 测试网络连接 #

使用 curlwget 等工具测试从本地或外部访问 Nginx。

(1)从本地访问 #

可以使用 curl 测试本地 Nginx 服务是否能正常访问:

curl http://localhost

如果本地访问没有问题,但外部访问无法连接,可能是防火墙、网络设置或端口配置问题。

(2)从外部访问 #

如果你的服务器有公网 IP,可以尝试从外部机器访问:

curl http://your-server-ip

6. 检查 Nginx 服务状态 #

检查 Nginx 服务是否正常运行:

sudo systemctl status nginx

如果 Nginx 没有运行,可以尝试重新启动服务:

sudo systemctl restart nginx

7. 检查 DNS 配置 #

如果你使用域名来访问 Nginx 服务,确保 DNS 解析正确。你可以使用 nslookupdig 命令检查 DNS 是否正确解析到服务器 IP。

(1)使用 nslookup 检查域名解析 #

nslookup example.com

(2)使用 dig 命令 #

dig example.com

总结 #

通过这些排查步骤,你应该能找出为什么 Nginx 服务无法访问的原因。常见的原因包括:

  • 配置错误(例如端口绑定、反向代理错误)
  • 防火墙或端口未开放
  • 应用服务未运行或配置错误
  • DNS 配置问题

逐步检查并解决这些问题,通常可以恢复服务的正常访问。如果需要更具体的帮助,可以提供错误日志或配置详情,我可以帮助你进一步分析。