记一次由docker容器使得服务器cpu占满密码和密钥无法访问bug

Bug场景:

前几天在服务器上部署了一个免费影视网站,这个应用需要四个容器,同时之前的建站软件workpress也是使用docker部署的,也使用了三个容器。在使用workpress之前,我将影视软件的容器全部停止
在这里插入图片描述
再使用workpress时,服务器的内存资源一切正常,此后就没管了。过了两天重新登入服务器时,发现完全登不进去。


问题描述

ssh登入失败,aliyun的workbench提示无法使用密码登入,此刻还没有意识到问题的严重性,以为是常见的配置问题(之前不小心配置了设置密钥对),首先重置密码,而后重启。
当服务器状态重启了半天还没有启动的时候,我就意识到了事情的严重性,使用VNC无密码登入,发现连接不上,使用finalshell连接访问超时。这时我理解估计是我服务器内部出现了问题。


原因分析:

使用阿里云的安全服务(推荐大家使用阿里云的云助手和自助的运维排查),发现是由于内存和cpu占用过高,当时我以为服务器被攻击了,因为之前的cpu的状态一直是很稳定的水平此刻一下子占百分之百。

在这里插入图片描述
在这里插入图片描述
通过查询资料,我发现cpu和内存的关系使用更加复杂

当内存资源紧张时,操作系统会启动一系列的内存管理机制来释放内存。操作系统通过 页面交换(swap) 和 内存回收(page reclaim) 来释放内存。

  • 页面交换(Swap):当物理内存(RAM)不足时,系统会将一些不活跃的内存页(数据)移动到交换空间(swap),从而腾出内存供当前活跃的进程使用。如果交换空间不足,或者交换操作过于频繁,会导致系统变得非常慢,因为硬盘的读取速度远低于内存。

  • 内存回收(Page Reclaim):这是指操作系统通过回收未被频繁使用的页面(通常是程序或数据的缓存)来释放内存。当系统发现某些内存页面长时间没有被访问时,它会将这些页面释放回空闲内存池。

当内存不足且系统开始触发内存回收和清理:

  • 清理内存:内核在进行内存回收时,将某些数据从内存移动到磁盘,或者将不再活跃的内存页面写入交换空间。如果内存中有大量的数据需要清理(例如缓存、文件系统数据、进程的私有内存等),那么这些清理动作就会导致磁盘的读写。

  • 磁盘缓存回收:当系统回收内存时,缓存(例如文件系统缓存、应用程序缓存等)中的数据会被清理。这些数据如果稍后还需要用到,就必须从磁盘重新读取。因此,系统的磁盘 IO 会迅速增加,因为很多。

所以根本原因是:内存不足,系统开始触发清理内存策略,而系统及程序运行本身就是需要那么多的数据,数据被清理后又必须重新加载,因此就导致了系统IO读高(清理掉的仍然需要从磁盘上读取)。同时清理本身需要磁盘输出,两者相加导致了磁盘IO高,当IO达到磁盘性能峰值时,CPU就只能等待磁盘数据什么也做不了,对于我们的响应无法回应。


解决过程——修改容器由docker自动重启策略:

  1. 首先由于已经无法登入,无法对操作系统做出指令,只能借助阿里云官方来协助。再控制台点击售后在线描述问题
    在这里插入图片描述

  2. 阿里云安排工程师来服务解决
    在这里插入图片描述

  3. 首先建立快照(备份)授权给阿里云。工程师帮云盘暂时扩容,就可以操控系统了

  4. 再获得命令控制权之后,修改了/etc/sysctl.conf文件下的vm.swappiness 值 ,修改成了40。
    执行了sysctl -p。vm.swappiness 是一个与 Linux 内存管理相关的参数,它控制着系统在内存使用达到一定水平时,使用交换空间(Swap)的程度。交换空间(Swap)是硬盘上的一个区域,用来存储暂时不需要常驻内存的内容,从而释放内存给更重要的进程。vm.swappiness 值的范围是 0 到 100。40 是一个平衡的设置,既能确保内存使用率不至于过高,也能避免过早地使用交换空间。

  5. 执行 sysctl -p执行 sysctl -p 命令的使 /etc/sysctl.conf 文件中的配置生效。

  6. 上述任务是使得内存到80使用swap,而不是等到90再使用,这样cpu不会被占满,使得再原先内存环境下仍可以使用cpu。

  7. 再登入系统之后使用配置下 atop监控工具,可以检查系统的进程
    在这里插入图片描述
    这里第一个进程是由于内存过大而产生的,此时我发现原先我关闭的docker应用居然全部都再运行,我之前明明是停止了的

  8. 原来因为我的容器再部署的时候直接默认是docker容器重启的时候同时自动重启如下代码所示,这就导致了当我7,8个容器运行的时候内存占用直接超过容量,而此刻我的swap策略没有过早的进行交换,这些使得cpu宕机,无法正常响应其他的操作。直接将容器停止并展示删除即可恢复正常的内存和cpu,重新部署的时候配置不自动重启

ocker inspect --format '{{.Name}}: {{.HostConfig.RestartPolicy.Name}}' wordpress_wnjx-wordpress_Wnjx-1
/wordpress_wnjx-wordpress_Wnjx-1: always

docker自动重启:

为什么需要设置自动重启策略?

自动重启策略可以确保即使在 Docker 或系统重启后,关键应用(如数据库、Web 服务器等)能够持续运行,减少人为干预。使用自动重启策略,容器会在错误退出后自动恢复,如果你有多个容器,手动监控和重启容器会非常麻烦。设置自动重启能够帮助自动化这个过程,减少运维负担。

重启策略如何与 Docker 守护进程重启结合使用

Docker 守护进程(Docker Daemon)会随着主机的重启而重启Docker 守护进程管理容器的生命周期,包括启动、停止、重启等。当 Docker 守护进程启动时,它会检查每个容器的重启策略,并决定是否重启这些容器。因此,如果设置了自动重启策略(例如 always 或 unless-stopped),当 Docker 守护进程启动时,符合条件的容器会被自动重启。

容器重启策略和系统服务管理(如 systemd)

可以将 Docker 容器配置为 systemd 服务,通过 systemd 来控制容器的启动和停止。例如,使用 systemd 也可以实现容器的自动重启。这样,即使 Docker 守护进程重启,systemd 也会确保容器按期望重启。

[Unit]
Description=Docker Container for my_container //描述服务的名称。
After=docker.service //确保容器在 Docker 守护进程启动后才会启动。
Requires=docker.service //如果 Docker 守护进程没有启动,容器服务将不会启动。[Service]
Restart=always/no //确保容器在退出时自动重启。也可以设置为 on-failure,只在容器异常退出时重启。
ExecStart=/usr/bin/docker start -a my_container//启动容器的命令,-a 选项确保容器的输出会连接到当前的终端。
ExecStop=/usr/bin/docker stop -t 2 my_container//停止容器的命令,-t 2 表示在容器关闭时等待 2 秒。
//指定该服务应该在系统的多用户模式下启动
[Install]
WantedBy=multi-user.target
//重新加载启动服务
sudo systemctl daemon-reload
sudo systemctl start docker-my-container.service

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/35506.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Matlab R2024b 中文版 下载及安装教程

点击下方链接下载安装包 Matlab R2024b 中文版安装包点击下载https://mp.weixin.qq.com/s/Kq2j1dQLdULOVV9vrA6pkA 安装教程 1.通过上方链接下载软件,鼠标右键【MATLAB R2024b(64bit)】压缩包,选择解压到MATLAB R2024b(64bit)。 2.双击进入解压后的文…

2024年12月6日Github流行趋势

项目名称:lobe-chat 项目维护者:arvinxx, semantic-release-bot, canisminor1990, lobehubbot, renovate项目介绍:一个开源的现代化设计的人工智能聊天框架。支持多AI供应商(OpenAI / Claude 3 / Gemini / Ollama / Qwen / DeepSe…

韩企研学团造访图为科技:共探人工智能创新前沿

今日,一支由韩国知名企业研学专家组成的代表团莅临图为科技深圳总部,展开了一场深度技术交流与研讨活动。 此次访问旨在通过实地探访中国领先的科技企业,促进中韩两国在科技创新领域的深入合作与交流。 韩国游学团合影 图为科技作为一家在人…

Vulnhub---kioptirx4 udf手工提权

个人博客 WuTongSec 打点 nmap -sP 192.168.128.0/24 找机器 nmap -P- 192.168.128.135 端口快扫 nmap -min-rate 10000 -sV -sC -O 192.168.128.135 脚本并没有扫出 什么洞 dirsearch -u http://192.168.128.135 目录扫描 三个200 那就先上web看看 web是应该登录框 在pas…

基于RISC-V的HSM方案

安全之安全(security)博客目录导读 本篇博客,我们聚焦RISC-V 2024中国峰会上RISC-V的一个HSM(Hardware Security Module)实现方案,来自芯来科技王松老师。 关于RISC-V TEE(可信执行环境)的相关方案,如感兴趣可参考RIS…

【C++探索学习】第十九弹——进程替换:深入解析操作系统中的进程替换机制

Linux学习笔记: https://blog.csdn.net/2301_80220607/category_12805278.html?spm1001.2014.3001.5482 前言: 在Linux操作系统中,进程替换(Process Replacement)是一个重要的概念,它允许程序通过系统调…

[软件工程]八.软件演化

8.1什么是软件演化 由于种种不可避免的原因,系统开发完成后的软件需要进行修改来适应变更的需求,我们对软件的修改就叫软件演化。 8.2为什么软件会演化 由于业务的变更或者为了满足用户期待的改变,使得对已有的系统的新需求浮现出来。由于…

WiFi受限不再愁,电脑无网络快速修复指南

有时在试图连接WiFi时,会发现网络连接受限,或无法正常访问互联网。这种情况不仅影响了工作效率,还可能错过重要的信息。那么,究竟是什么原因导致了电脑WiFi连接受限呢?又该如何解决这一问题呢?小A今天就来教…

【Liunx篇】基础开发工具 - yum

文章目录 🌵一.Liunx下安装软件的方案🐾1.源代码安装🐾2.rpm包安装🐾3.包管理器进行安装 🌵二.软件包管理器-yum🌵三.yum的具体操作🐾1.查看软件包🐾2.安装软件包🐾3.卸载…

第七节(2)、T型加减速优化处理【51单片机-TB6600驱动器-步进电机教程】

摘要:本节介绍解决标准T型加减速过程中的两个缺陷,其一是使得初速度任意设置;其二是降低Cn递推计算量,提升速度上限 一. 加速减速过程计算 1.1计算不存在匀速过程 根据基本运动定理: w m a x w 0 a 0 ∗ t n 0 … …

什么是继承性?C++中如何实现继承? 继承的好处和注意事项有哪些?

1) 什么是继承性?C中如何实现继承? 一、继承性的概念 继承性是面向对象编程中的一个重要特性,它允许一个类(称为子类或派生类)继承另一个类(称为父类或基类)的属性和方法。继承的主要目的是实现…

唇形同步视频生成工具:Wav2Lip

一、模型介绍 今天介绍一个唇形同步的工具-Wav2Lip;Wav2Lip是一种用于生成唇形同步(lip-sync)视频的深度学习算法,它能够根据输入的音频流自动为给定的人脸视频添加准确的口型动作。 (Paper) Wav2Lip模型…

ESP32使用TCA9548A IIC多路复用器拓展

ESP32使用TCA9548A IIC多路复用器拓展 本文将讲述如何使用TCA9458A IIC多路复用器扩展IIC总线端口。使用相同的IIC地址控制多个IIC设备,如多个OLED或BME280等 TCA9548介绍 IIC通信协可以实现在同一IIC总线上与多个IIC设备通信,只要所有设备都具有唯一…

BGP路径属性与路由反射器

BGP路径属性 路径属性: 任何一条BGP路由都拥有多个路径属性 当路由器将BGP路由通告给它的对等体时,一并被通告的还有路由所携带的各各路径属性 BGP的路径属性将影响路由优选 路径四个属性分类: 公认必遵:必须包括在每个upda…

C语言期末考试——重点考点

目录 1.C语言的结构 2.三种循环结构 3.逻辑真假判断 4. printf函数 5. 强制类型转化 6. 多分支选择结构 7. 标识符的定义 8. 三目运算符 1.C语言的结构 选择结构、顺序结构、循环结构 2.三种循环结构 for、while、do-while 3.逻辑真假判断 C语言用0表示false,用非0(不…

ci/cd配置任务超时时间

有两个地方决定了任务超时时间: 1. 2.gitlab-runner

JUC:Synchronized和锁升级

1. 面试题 谈谈你对Synchronized的理解Sychronized的锁升级你聊聊Synchronized实现原理,monitor对象什么时候生成的?知道monitor的monitorenter和monitorexit这两个是怎么保证同步的嘛?或者说这两个操作计算机底层是如何执行的偏向锁和轻量级…

梯度下降法以及 Python 实现

文章目录 1. 引言2. 梯度法3. 例子4. 代码实现5. 讨论 — 学习率 η \eta η5.1 当 η \eta η 设置过大5.2 当 η \eta η 设置过小 参考 1. 引言 梯度下降法,可以根据微分求出的斜率计算函数的最小值。 在人工智能中,经常被应用于学习算法。 2. 梯…

OpenCV-图像阈值

简单阈值法 此方法是直截了当的。如果像素值大于阈值,则会被赋为一个值(可能为白色),否则会赋为另一个值(可能为黑色)。使用的函数是 cv.threshold。第一个参数是源图像,它应该是灰度图像。第二…

详细了解IO分类

按照数据流方向如何划分? 输入流(Input Stream):从源(如文件、网络等)读取数据到程序。 输出流(Output Stream):将数据从程序写出到目的地(如文件、网络、控…