当前位置: 首页 > news >正文

记一次由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

相关文章:

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

Bug场景: 前几天在服务器上部署了一个免费影视网站,这个应用需要四个容器,同时之前的建站软件workpress也是使用docker部署的,也使用了三个容器。在使用workpress之前,我将影视软件的容器全部停止。 再使用workpress…...

前端TS基础

文章目录 一、类型1、定义类型2、any、unknown、never3、基础类型4、联合类型5、交叉类型6、type、typeof7、作用域 二、数据结构1、数组2、元组3、函数类型4、对象类型 三、接口四、泛型五、enum六、断言七、工具1、模块2、namespace3、装饰器4、declare5、运算符6、映射类型7…...

前端面经每日一题day06

Cookie有什么字段 Name:cookie的唯一标识符 Value:与Name对应,存储Cookie的信息 Domain:可以访问cookie的域名 Path:可以访问cookie的路径 Expires/Max-Age:超时时间 Size:cookie大小 Ht…...

SOC,SOH含义区别及计算公式

SOC,SOH含义区别及计算公式 两者结合使用,有助于实现更精确的电池管理,延长电池的使用寿命,并确保电池的高效、安全运行。 1. SOC(State of Charge,荷电状态)2. SOH(State of Health…...

阿里云轻量应用服务器开放端口,图文教程分享

阿里云轻量应用服务器如何开放端口?在轻量服务器管理控制台的防火墙中添加规则即可开通端口,开通80端口就填80,开通443就填443端口,开通3306端口就填3306。阿里云百科网aliyunbaike.com整理阿里云轻量应用服务器端口号开通图文教程…...

嵌入式里的“移植”概念

这里因为最近一年看到公司某项目很多代码上有直接硬件的操作,这里有感而发,介绍移植的概念。 一、硬件 先上一个图: 举个例子,大学里应该都买过开发板,例如st的,这里三个层次, 内核&#xff…...

深入探讨 AF_PACKET 套接字

AF_PACKET 套接字是一种用于直接访问网络接口(即网卡)的套接字类型,通常用于网络数据包捕获和分析。它允许应用程序直接与网络接口卡(NIC)交互,而不需要通过网络协议栈。从而可以发送和接收以太网帧。它提供了比普通TCP/UDP套接字…...

Redis的哨兵机制

目录 1. 文章前言2. 基本概念2.1 主从复制的问题2.2 人工恢复主节点故障2.3 哨兵机制自动恢复主节点故障 3. 安装部署哨兵(基于docker)3.1 安装docker3.2 编排redis主从节点3.3 编排redis-sentinel节点 4. 重新选举5. 选举原理6. 总结 1. 文章前言 &…...

CSS系列(1)-- 选择器体系详解

前端技术探索系列:CSS 选择器体系详解 🎯 致读者:探索 CSS 选择器的奥秘 👋 前端开发者们, 今天我们将深入探讨 CSS 选择器体系,这是构建优雅样式表的基础。让我们一起学习如何精确地选中并控制网页中的…...

用Python开发打字速度测试小游戏

本文将带你一步步开发一个简单的打字速度测试小游戏,通过随机生成词组并计算用户输入速度,帮助提升打字技能。 一、功能描述 随机生成一段句子,用户需要尽快输入。计时功能,统计用户输入的总时长。对比正确率和速度,给出评分反馈。二、开发环境 语言:Python依赖库:pygam…...

基于gitlab API刷新MR的commit的指定status

场景介绍 自己部署的gitlab Jenkins,并已经设置好联动(如何设置可以在网上很容易搜到)每个MergeRequest都可以触发多个Jenkins pipeline,pipeline结束后会将状态更新到gitlab这个MR上希望可以跳过pipeline运行,直接将指定的MR的指定pipeline状态刷新为…...

服务器数据恢复—LINUX下各文件系统删除/格式化的数据恢复可行性分析

Linux操作系统是世界上流行的操作系统之一,被广泛用于服务器、个人电脑、移动设备和嵌入式系统。Linux系统下数据被误删除或者误格式化的问题非常普遍。下面北亚企安数据恢复工程师简单聊一下基于linux的文件系统(EXT2/EXT3/EXT4/Reiserfs/Xfs&#xff0…...

Spark on Yarn安装配置,大数据技能竞赛(容器环境)

Spark on Yarn模式,即把Spark作为一个客户端,将作业提交给Yarn服务,由于在生产环境中,很多时候都要与Hadoop使用同一个集群,因此采用Yarn来管理资源调度,可以有效提高资源利用率。 环境说明: 服…...

遣其欲,而心自静 -- 33DAI

显然,死做枚举只能的50分。 错了4次总算对了。 大体思路: 因题目说只有两个因数,那么有两种情况: 1:两个质数相乘,如:3*515 5*745 等(不包括5*525 或5*315 重复计算\ 因为3*5算了…...

No.25 笔记 | 信息收集与Google语法的实践应用

什么是信息收集? 信息收集(Information Gathering)是渗透测试的第一步,其目的是通过各种手段收集目标的漏洞和弱点,为后续的攻击策略提供依据。 正所谓“知己知彼,百战百胜”,信息收集的重要性…...

GitLab基础环境部署:Ubuntu 22.04.5系统在线安装GitLab 17.5.2实操手册

文章目录 GitLab基础环境部署:Ubuntu 22.04.5系统在线安装GitLab 17.5.2实操手册一、环境准备1.1 机器规划1.2 环境配置1.2.1 设置主机名1.2.2 停止和禁用防火墙1.2.3 更新系统 二、GitLab安装配置2.1 安装GitLab所需的依赖包2.2 添加GitLab存储库2.2.1 将GitLab存储…...

SpringBoot3配置文件

一、统一配置管理概述: SpringBoot工程下,进行统一的配置管理,你想设置的任何参数(端口号、项目根路径、数据库连接信息等等)都集中到一个固定位置和命名的配置文件(application.properties或application.yml)中 配置文件应该放置在Spring Boot工程的s…...

【机器学习】任务十二:循环神经网络

1.循环神经网络 1.1 什么是循环神经网络(RNN)? 循环神经网络(Recurrent Neural Network, RNN) 是一种用于处理序列数据的神经网络类型,它的主要特点是拥有循环连接,使得网络可以对序列中的每个…...

【返璞归真】-切比雪夫不等式(Chebyshev‘s Inequality)

切比雪夫不等式(Chebyshev’s Inequality) 切比雪夫不等式是概率论中的一个基本不等式,用于估计随机变量偏离其期望值一定范围的概率。它对于任何具有有限期望和有限方差的随机变量都成立。 公式表达 切比雪夫不等式的基本形式如下&#xf…...

【Django】在view中调用channel来主动进行websocket通信

前提:consumer中已经写好了建立连接的代码,并且能够成功把连接加入到通道层的组内 可以参考我的另一个博客: LuckySheet协同编辑后端示例(DjangoChannel,Websocket通信)_lucksheet 协同编辑-CSDN博客 我是懒得去折腾luckysheet的源码&…...

脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)

一、数据处理与分析实战 (一)实时滤波与参数调整 基础滤波操作 60Hz 工频滤波:勾选界面右侧 “60Hz” 复选框,可有效抑制电网干扰(适用于北美地区,欧洲用户可调整为 50Hz)。 平滑处理&…...

是否存在路径(FIFOBB算法)

题目描述 一个具有 n 个顶点e条边的无向图,该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序,确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数,分别表示n 和 e 的值(1…...

C++.OpenGL (20/64)混合(Blending)

混合(Blending) 透明效果核心原理 #mermaid-svg-SWG0UzVfJms7Sm3e {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-icon{fill:#552222;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-text{fill…...

MLP实战二:MLP 实现图像数字多分类

任务 实战(二):MLP 实现图像多分类 基于 mnist 数据集,建立 mlp 模型,实现 0-9 数字的十分类 task: 1、实现 mnist 数据载入,可视化图形数字; 2、完成数据预处理:图像数据维度转换与…...

IP选择注意事项

IP选择注意事项 MTP、FTP、EFUSE、EMEMORY选择时,需要考虑以下参数,然后确定后选择IP。 容量工作电压范围温度范围擦除、烧写速度/耗时读取所有bit的时间待机功耗擦写、烧写功耗面积所需要的mask layer...

多模态大语言模型arxiv论文略读(110)

CoVLA: Comprehensive Vision-Language-Action Dataset for Autonomous Driving ➡️ 论文标题:CoVLA: Comprehensive Vision-Language-Action Dataset for Autonomous Driving ➡️ 论文作者:Hidehisa Arai, Keita Miwa, Kento Sasaki, Yu Yamaguchi, …...

本地部署drawDB结合内网穿透技术实现数据库远程管控方案

文章目录 前言1. Windows本地部署DrawDB2. 安装Cpolar内网穿透3. 实现公网访问DrawDB4. 固定DrawDB公网地址 前言 在数字化浪潮席卷全球的背景下,数据治理能力正日益成为构建现代企业核心竞争力的关键因素。无论是全球500强企业的数据中枢系统,还是初创…...

Go 语言中的内置运算符

1. 算术运算符 注意: (自增)和--(自减)在 Go 语言中是单独的语句,并不是运算符。 package mainimport "fmt"func main() {fmt.Println("103", 103) // 13fmt.Println("10-3…...

【设计模式】1.简单工厂、工厂、抽象工厂模式

every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?typeblog 0. 前言 以下是 简单工厂模式、工厂方法模式 和 抽象工厂模式 的 Python 实现与对比,结合代码示例和实际应用场景说明: 1. 简单工厂模式&a…...

vue3 vite.config.js 引入bem.scss文件报错

[sass] Can’t find stylesheet to import. ╷ 1 │ use “/bem.scss” as *; │ ^^^^^^^^^^^^^^^^^^^^^^ ╵ src\App.vue 1:1 root stylesheet 分析 我们遇到了一个在Vue3项目中使用Vite时,在vite.config.js中引入bem.scss文件报错的问题。错误信息指出在App.vue…...