当前位置: 首页 > 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的源码&…...

三维GIS开发cesium智慧地铁教程(5)Cesium相机控制

一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点&#xff1a; 路径验证&#xff1a;确保相对路径.…...

UE5 学习系列(三)创建和移动物体

这篇博客是该系列的第三篇&#xff0c;是在之前两篇博客的基础上展开&#xff0c;主要介绍如何在操作界面中创建和拖动物体&#xff0c;这篇博客跟随的视频链接如下&#xff1a; B 站视频&#xff1a;s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...

【Go】3、Go语言进阶与依赖管理

前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课&#xff0c;做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程&#xff0c;它的核心机制是 Goroutine 协程、Channel 通道&#xff0c;并基于CSP&#xff08;Communicating Sequential Processes&#xff0…...

智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制

在数字化浪潮席卷全球的今天&#xff0c;数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具&#xff0c;在大规模数据获取中发挥着关键作用。然而&#xff0c;传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时&#xff0c;常出现数据质…...

Web 架构之 CDN 加速原理与落地实践

文章目录 一、思维导图二、正文内容&#xff08;一&#xff09;CDN 基础概念1. 定义2. 组成部分 &#xff08;二&#xff09;CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 &#xff08;三&#xff09;CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 &#xf…...

scikit-learn机器学习

# 同时添加如下代码, 这样每次环境(kernel)启动的时候只要运行下方代码即可: # Also add the following code, # so that every time the environment (kernel) starts, # just run the following code: import sys sys.path.append(/home/aistudio/external-libraries)机…...

并发编程 - go版

1.并发编程基础概念 进程和线程 A. 进程是程序在操作系统中的一次执行过程&#xff0c;系统进行资源分配和调度的一个独立单位。B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。C.一个进程可以创建和撤销多个线程;同一个进程中…...

C语言中提供的第三方库之哈希表实现

一. 简介 前面一篇文章简单学习了C语言中第三方库&#xff08;uthash库&#xff09;提供对哈希表的操作&#xff0c;文章如下&#xff1a; C语言中提供的第三方库uthash常用接口-CSDN博客 本文简单学习一下第三方库 uthash库对哈希表的操作。 二. uthash库哈希表操作示例 u…...

android RelativeLayout布局

<?xml version"1.0" encoding"utf-8"?> <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"match_parent"android:gravity&…...

面试高频问题

文章目录 &#x1f680; 消息队列核心技术揭秘&#xff1a;从入门到秒杀面试官1️⃣ Kafka为何能"吞云吐雾"&#xff1f;性能背后的秘密1.1 顺序写入与零拷贝&#xff1a;性能的双引擎1.2 分区并行&#xff1a;数据的"八车道高速公路"1.3 页缓存与批量处理…...