k8s pod 一直重启 code 137 排查记录

现象

k8s pod一直在重启,调度不起来

排查

1. 首先看状态

这个比较简单,我直接在页面上的(rancher查看api、查看/编辑yaml等都能看)
在这里插入图片描述

如图,找到containerStatuses,里面有个exitCode:137
网上搜了下错误码的意思:

  • 退出代码 0:一般为容器正常退出
  • 退出代码 1:由于容器中 pid 为 1 的进程错误而失败
  • 退出代码 137:由于容器收到 SIGKILL 信号而失败(手动执行或“oom-killer” [OUT-OF-MEMORY])
    = 退出代码 139:由于容器收到 SIGSEGV 信号而失败
  • 退出代码 143:由于容器收到 SIGTERM 信号而失败

网上对137的解释:一般为pod容器内存达到资源限制(resources.limits)或者宿主机本身内存不够了。

我们知道,oom被kill是可以在系统日志里看到的:
ubuntu 的系统日志在 /var/log/syslog,centos 的系统日志在 /var/log/messages

2. 登录机器排查

大致判断可能是OOM导致之后,需要进机器看下真实情况

  1. 首先看下pod所在的node
[superuser@server2558 ~]$ sudo kubectl get pod -n mynamespace -o wide
NAME                                           READY   STATUS             RESTARTS   AGE   IP               NODE               NOMINATED NODE   READINESS GATES
elasticsearch-568889b5f-h482t   0/1     CrashLoopBackOff   8          23m   10.x.x.x    a2617              <none>           <none>          <none>           <none>

如图,这个异常的pod被调度到了a2617节点

  1. 找到节点ip
[superuser@server2558 ~]$ sudo kubectl describe node a2617
Name:               a2617
Roles:              <none>
Labels:             beta.kubernetes.io/arch=amd64
                    beta.kubernetes.io/os=linux
                    jindi.com/group=xxx
                    kubernetes.io/arch=amd64
                    kubernetes.io/hostname=s2678-daben
                    kubernetes.io/os=linux
Annotations:        kubeadm.alpha.kubernetes.io/cri-socket: /var/run/dockershim.sock
                    node.alpha.kubernetes.io/ttl: 0
                    projectcalico.org/IPv4Address: 172.x.x.5/16
......

如图,ip为172.x.x.5
3. 查看节点剩余内存

[superuser@server2558 ~]$ sudo kubectl top nodes
NAME               CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%   
a2617              194m         4%     19869Mi         62%  
......

32G的机器,内存还剩10来个G…

  1. 登录节点机器,查看日志
[superuser@server2558 ~]$ sudo tail -n 100 /var/log/messages
Feb 10 16:07:47 a2617 kernel: [17948]  1000 17948  3990899  3029423    5957        0           802 java
Feb 10 16:07:47 a2617 kernel: Out of memory: Kill process 17948 (java) score 1184 or sacrifice child
Feb 10 16:07:47 a2617 kernel: Killed process 17948 (java), UID 1000, total-vm:15963596kB, anon-rss:12117692kB, file-rss:0kB, shmem-rss:0kB
Feb 10 16:07:47 a2617 kernel: calico-node invoked oom-killer: gfp_mask=0x201da, order=0, oom_score_adj=-998
Feb 10 16:07:47 a2617 kernel: calico-node cpuset=docker-70e0f5934f06de65ae596cc16b1b467b14fc9842796a01e8ae9eda42fe1b6431.scope mems_allowed=0

比较关键都信息Killed process 17948 (java), UID 1000, total-vm:15963596kB, anon-rss:12117692kB, file-rss:0kB, shmem-rss:0kB

  • total-vm 进程总共使用的虚拟内存;
  • anon-rss:虚拟内存实际占用的物理内存;

所以,可以看到,这个应用一下子申请了12G的无力内存,而节点内存没有那么多了,所以oom。

3. 处理

要么调度到其他节点上,要么给内存做下限制。

我是给pod加了资源限制, 再重启就好了。

resources:
  limits:
    cpu: "1"
    memory: 6Gi
  requests:
    cpu: 100m
    memory: 6Gi

问题:咨询我们运维,他表示pod的limit不会影响服务申请多少内存,只会在服务申请大于limit的内存时,直接异常。如果程序真的需要12G的内存,这么配置应该是无效的,可能是我改了参数,调度到了其他正常的节点,所以启动成功了。

但,观察两次调度的节点,第二次的节点内存比第一次的节点内存更小。如果还申请了12G内存,肯定会启动不成功。所以我感觉可能跟配置还是有点关系。大致是考虑服务可以申请12G内存,也可以申请更小的内存,如果我们没限制,他会申请更大的内存,导致oom, 限制了,申请小的内存,也能保证正常启动。

知道的朋友请帮忙解答下,谢谢


[1] https://www.bookstack.cn/read/kubernetes-practice-guide/troubleshooting-trick-analysis-exitcode.md
[2] https://www.xtplayer.cn/kubernetes/pod-container-restart-reason-check/#%E6%A3%80%E6%9F%A5%E5%AE%B9%E5%99%A8%E9%80%80%E5%87%BA%E5%8E%9F%E5%9B%A0%EF%BC%88reason%EF%BC%89%E5%92%8C%E7%8A%B6%E6%80%81%E7%A0%81

<think>好的,我现在需要回答用户关于TFT显示屏镜像设置的问题。首先,用户提到了几个引用来源,我需要仔细看看这些引用中的信息是否相关,并正确引用它们。 用户的问题是关于如何对TFT显示屏进行镜像处理,特别是询问设置方法。根据提供的引用内容,引用[1]、[2]、[3]都涉及TFT LCD的镜像显示问题,尤其是ST7789和ILI9325型号的控制器。因此,我需要结合这些信息来构建回答。 首先,我需要回忆TFT显示屏镜像处理的基本原理。通常,显示屏的镜像或翻转显示是通过修改控制器的寄存器设置来实现的。不同的控制器(如ST7789、ILI9325)可能有不同的寄存器配置方式,但基本思路是调整显示方向或镜像标志位。 接下来,引用[3]提到了通过设置显示方向函数来改变LCD的显示方向,这可能涉及到X轴或Y轴的镜像设置。例如,ILI9325控制器可能有特定的寄存器位用于控制水平或垂直镜像。引用[1]和[2]则提到ST7789的镜像操作以及可能出现的问题,如白屏或镜像显示异常,解决方法包括修改寄存器读写操作或调整字体导出变量。 在回答中,我需要分步骤说明如何进行镜像设置,包括硬件连接确认、控制器型号确定、寄存器配置方法以及可能的代码示例。同时,需要指出不同控制器的差异,并提醒用户注意驱动兼容性和测试的重要性。 此外,用户可能需要了解常见的镜像模式,如水平镜像、垂直镜像或两者组合。需要解释如何通过寄存器位来启用这些模式,例如设置特定的位值来翻转X或Y方向的显示。 还要注意用户提供的引用中提到的问题,比如修改读写寄存器的顺序或字体变量可能影响显示效果,这些可以作为注意事项或常见问题解决方法的一部分。 最后,生成的相关问题需要涵盖镜像原理、常见问题、不同控制器差异以及应用场景,以帮助用户进一步探索。 现在,整理这些思路,确保按照系统级指令使用正确的中文和LaTeX格式,引用标记自然添加,结构清晰,并生成相关问题。</think>[用户可见层] # TFT显示屏镜像设置方法详解 TFT显示屏的镜像显示功能通过修改控制器寄存器参数实现,以下是具体操作步骤: ## 一、基础设置流程 1. **确认控制器型号** 不同控制器(如$ST7789$、$ILI9325$)寄存器地址不同,需查阅对应数据手册[^1][^3]。 2. **寄存器配置** 典型镜像参数设置示例: - 水平镜像:设置`MV`位为1(如ILI9325的0x03寄存器) - 垂直镜像:设置`MY`位为1(如ST7789的0x36寄存器) ```c // ST7789水平镜像设置代码示例 void SET_MirrorMode(void) { Write_Command(0x36); Write_Data(0x80); // MX=1开启水平镜像 } ``` 3. **显示方向函数封装** 引用[3]提供的代码结构: ```c void LCD_SetDirection(u8 mode) { if(mode & 0x01) LCD_WriteReg(0x03, 0x1030); // 横屏+镜像 else LCD_WriteReg(0x03, 0x0030); // 默认竖屏 } ``` ## 二、注意事项 1. **驱动兼容性** 部分控制器需同时调整GRAM写入顺序,如修改`CASET`和`RASET`的起始/结束地址[^2]。 2. **异常处理** 出现白屏时可检查: - 寄存器写入时序是否符合时序图要求 - 数据总线宽度配置是否正确[^2] 3. **性能影响** 镜像模式可能增加$2\%-5\%$的显存访问延迟,建议通过DMA传输优化。 ## 三、不同控制器对比 | 控制器 | 水平镜像寄存器 | 垂直镜像寄存器 | |--------|----------------|----------------| | ST7789 | 0x36[6] (MX) | 0x36[7] (MY) | | ILI9341| 0x36[5] (MV) | 0x36[4] (MH) | | ILI9325| 0x03[12] (MV) | 0x03[11] (MH) |
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值