记一次由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自动重启策略:
-
首先由于已经无法登入,无法对操作系统做出指令,只能借助阿里云官方来协助。再控制台点击售后在线描述问题
-
阿里云安排工程师来服务解决
-
首先建立快照(备份)授权给阿里云。工程师帮云盘暂时扩容,就可以操控系统了
-
再获得命令控制权之后,修改了/etc/sysctl.conf文件下的vm.swappiness 值 ,修改成了40。
执行了sysctl -p。vm.swappiness 是一个与 Linux 内存管理相关的参数,它控制着系统在内存使用达到一定水平时,使用交换空间(Swap)的程度。交换空间(Swap)是硬盘上的一个区域,用来存储暂时不需要常驻内存的内容,从而释放内存给更重要的进程。vm.swappiness 值的范围是 0 到 100。40 是一个平衡的设置,既能确保内存使用率不至于过高,也能避免过早地使用交换空间。 -
执行 sysctl -p执行 sysctl -p 命令的使 /etc/sysctl.conf 文件中的配置生效。
-
上述任务是使得内存到80使用swap,而不是等到90再使用,这样cpu不会被占满,使得再原先内存环境下仍可以使用cpu。
-
再登入系统之后使用配置下 atop监控工具,可以检查系统的进程
这里第一个进程是由于内存过大而产生的,此时我发现原先我关闭的docker应用居然全部都再运行,我之前明明是停止了的 -
原来因为我的容器再部署的时候直接默认是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…...
功能篇:JAVA实现记住我功能
在Java Web应用程序中实现“记住我”功能,通常涉及以下几个步骤: 1. 创建一个持久化的标识符(如一个令牌或哈希值),并将其与用户账户关联。 2. 将这个标识符保存到客户端的cookie中。 3. 在服务器端,当用户…...
实现 DataGridView 下拉列表功能(C# WinForms)
本文介绍如何在 WinForms 中使用 DataGridViewComboBoxColumn 实现下拉列表功能,并通过事件响应来处理用户的选择。以下是实现步骤和示例代码。 1. 效果展示 该程序的主要功能是展示如何在 DataGridView 中插入下拉列表,并在选择某一项时触发事件。 2.…...
2024年上半年网络工程师综合知识真题及答案解析
2024年上半年网络工程师综合知识真题及答案解析 以下不属于5G网络优点的是()A.传输过程中消耗的资源少,对设备的电池更友好B.支持大规模物联网,能够连接大量低功耗设备,提供更高效的管理C.引入了网络切片技术,允许将物理网络划分为多个虚拟网络D.更好的安全性,采用更…...
数合平台功能-管理角色
前一阵,有朋友问到,看咱们产品的功能描述很强大,但很多功能看不到。为此,基于数据建模产品最新版本,和大家一起串一下产品的功能和使用路径。本节重点说一下管理角色有哪些功能 一、功能清单 从上图中可以看到&#x…...
LVGL9 开关控件 (lv_switch) 使用指南
文章目录 前言主体1. **控件概述**2. **控件的样式和组成部分**3. **使用控件**改变开关状态 4. **事件处理**5. **按键支持**6. **示例代码** 总结 前言 lv_switch 是 LittlevGL 提供的一个开关控件,外观类似一个小型滑块,常用于实现开关功能ÿ…...
麒麟 V10 系统(arm64/aarch64)离线安装 docker 和 docker-compose
前期准备 查看操作系统版本,跟本文标题核对一下 uname -a查看操作系统架构 uname -m下载离线包 下载 docker 离线包 地址:https://download.docker.com/linux/static/stable/ 选择系统架构对应的文件目录:aarch64,我目前使用…...
独立ip服务器有什么优点?
网站的性能和安全性直接影响到用户体验和业务发,独立IP服务器作为一种主流的托管方式,因其独特的优势而受到许多企业和个人站长的青睐。与共享IP相比,独立IP服务器到底有哪些优点呢? 使用独立IP的用户不必担心与其他网站共享同一…...
oracle之用户的相关操作
(1)创建用户(sys用户下操作) 简单创建用户如下: CREATE USER username IDENTIFIED BY password; 如果需要自定义更多的信息,如用户使用的表空间等,可以使用如下: CREATE USER mall IDENTIFIED BY 12345…...
深入浅出:PHP中的数组操作全解析
文章目录 引言理解数组创建数组使用方括号使用array()函数 访问数组元素数值索引数组关联数组 遍历数组使用for循环使用foreach循环 添加和修改数组元素添加元素修改元素 删除数组元素删除单个元素删除整个数组 多维数组创建多维数组访问多维数组元素 常用数组函数获取数组长度…...
2024年12月7日历史上的今天大事件早读
1732年12月07日英国皇家大剧院在伦敦开幕 1798年12月07日清代诗人袁枚逝世 1889年12月07日第一个充气轮胎受专利保护 1916年12月07日劳合-乔治出任英国首相 1926年12月07日第一台电冰箱受美国专利保护 1937年12月07日南京保卫战正式打响 1941年12月07日日本偷袭珍珠港 1…...
pymysql模块详解
华子目录 简介安装pymysql连接对象常用方法游标对象常用方法数据库操作查改批量增加删 使用with语句总结 简介 pymysql是一个用于Python编程的第三方模块,用于连接和操作MySQL数据库。它提供了一个简单而强大的接口,使开发者能够轻松地在Python程序中执…...
计算机网络研究实训室建设方案
一、概述 本方案旨在规划并实施一个先进的计算机网络研究实训室,旨在为学生提供一个深入学习、实践和研究网络技术的平台。实训室将集教学、实验、研究于一体,覆盖网络基础、网络架构、网络安全、网络管理等多个领域,以培养具备扎实理论基础…...
WEB安全 PHP学习
PHP基础 PHP编码显示问题 header ("Content-type: text/html; charsetgb2312"); header("Content-Type: text/html;charsetutf-8"); windows需要使用gbk编码显示 源码是 <?php header ("Content-type: text/html; charsetgb2312"); sys…...
Redis高阶之容错切换
当一台主机master宕掉之后,他的从机会取代主机么? 查看集群状态 127.0.0.1:6385> cluster nodes c8ff33e8da5fd8ef821c65974dda304d2e3327f9 192.168.58.129:638216382 slave f6b1fd5e58df90782f602b484c2011d52fc3482d 0 1733220836918 1 connecte…...
构建高效OTA旅游平台的技术指南
1. 引言 在信息技术高速发展的今天,互联网深刻地改变了人们的旅行方式。传统的旅行社模式逐渐被在线旅游平台所取代,OTA(Online Travel Agency,在线旅行社)旅游平台应运而生,成为人们获取旅游信息、预订旅…...
数据结构 (25)图的存储结构
前言 数据结构中的图是一种用于表示多对多关系的结构,其存储结构主要有两种:邻接矩阵和邻接表。 一、邻接矩阵 定义:邻接矩阵是一个二维数组,用于存储图中各个顶点之间的关系。数组的行和列分别代表图中的顶点,元素的值…...
【C语言】fscanf 和 fprintf函数
【C语言】fscanf 和 fprintf函数 文章目录 [TOC](文章目录) 前言一、定义二、代码例程三、实验结果四、参考文献总结 前言 使用工具: 1.编译器:DEVC 2.C Primer Plus 第六版-1 提示:以下是本篇文章正文内容,下面案例可供参考 一…...
C#调用c++创建的动态链接库dll文件
在C#中调用外部DLL文件是一种常见的编程实践,它具有以下几个重要意义:1.代码重用;2.模块化;3.性能优化;4.安全性;5.跨平台兼容性;6.方便更新和维护;7.利用特定技术或框架;…...
【数字电路与逻辑设计】实验一 序列检测器
文章总览:YuanDaiMa2048博客文章总览 【数字电路与逻辑设计】实验一 序列检测器 一、实验内容二、设计过程(一)作出状态图或状态表(二)状态化简(三)状态编码 三、源代码(一ÿ…...
沈阳工业大学《2024年827自动控制原理真题》 (完整版)
本文内容,全部选自自动化考研联盟的:《沈阳工业大学827自控考研资料》的真题篇。后续会持续更新更多学校,更多年份的真题,记得关注哦~ 目录 2024年真题 Part1:2024年完整版真题 2024年真题...
Javascript Clipper library, v6(介绍目录)
1.老祖宗C#版的Clipper2 Clipper2库可以对简单和复杂的多边形执行交集、并并、差分和异或布尔运算。它还执行多边形偏移 github地址:GitHub - AngusJohnson/Clipper2: Polygon Clipping and Offsetting - C, C# and Delphi 2.目前的移植版本 基于C#版的移植版本…...
uniapp+vue3+ts请求接口封装
1.安装luch-request yarn add luch-requestnpm install luch-request2.新建文件src/utils/request.ts 需要自己修改config.baseURL和token(获取存储的token) // import HttpRequest from luch-request; import type { HttpRequestConfig, HttpRespons…...
Spring Boot中的@GetMapping注解可以用于处理HTTP GET请求,并且可以接收对象参数,详细示例
下面内容来自Ai回答,经过亲自验证,正确 Spring Boot中的GetMapping注解可以用于处理HTTP GET请求,并且可以接收对象参数。 接收对象参数的基本方式 在Spring Boot中,可以通过GetMapping注解接收对象参数,这通…...
详解Vue设计模式
详解 vue 设计模式 Vue.js 作为一个流行的前端框架,拥有许多设计模式,这些设计模式帮助开发者更好地组织和管理代码,提升代码的可维护性、可扩展性和可读性。Vue 设计模式主要体现在以下几个方面: 1. 组件化设计模式 (Compon…...
webpack 题目
文章目录 webpack 中 chunkHash 和 contentHash 的区别loader和plugin的区别?webpack 处理 image 是用哪个 loader,限制 image 大小的是...;webpack 如何优化打包速度 webpack 中 chunkHash 和 contentHash 的区别 主要从四方面来讲一下区别&…...
Mysql - 存储引擎
一 MYSQL体系结构简介 MYSQL的体系结构可以分为四个层级,从上往下依次为: 1. 连接层: 最上层为客户端以及一些连接服务,包含连接操作,例如JAVA想要与MYSQL建立连接就需要用到JDBC,PHP语言与Python也可以连接到MYSQL&am…...
【实战教程】使用YOLOv8 OBB进行旋转框目标检测的数据集定义与训练【附源码】
《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发】2.【车牌识别与自动收费管理系统开发】3.【手势识别系统开发】4.【人脸面部活体检测系统开发】5.【图片风格快速迁移软件开发】6.【人脸表表情识别系统】7.【…...
怎么实现邮件营销自动化?
邮件营销能够出色地帮助我们与客户建立良好关系。无论是新客户还是老客户,都可以通过邮件来达成较为良好的客户关系。然而,从消费者的角度来看,每个人都有自己独特的习惯和特点,没有人希望收到千篇一律、营销意味过重的邮件。因此…...
华为服务器使用U盘重装系统
一、准备工作 下载官方系统(注意服务器CPU的架构是x86-64还是aarch64,不然可能报意想不到的错)制作启动U盘(下载rufus制作工具,注意文件系统选FAT32还是NTFS) 二、安装步骤 将U盘插入USB接口重启服务器…...
空安全编程的典范:Java 8中的安全应用指南
文章目录 一、Base64 编码解码1.1 基本的编码和解码1.2 URL 和文件名安全的编码解码器1.3 MIME Base64编码和解码 二、Optional类三、Nashorn JavaScript 一、Base64 编码解码 1.1 基本的编码和解码 Base64 编码: 使用 Base64.getEncoder().encodeToString(origin…...
深入解析 Loss 减少方式:mean和sum的区别及其在大语言模型中的应用 (中英双语)
深入解析 Loss 减少方式:mean 和 sum 的区别及其在大语言模型中的应用 在训练大语言模型(Large Language Models, LLM)时,损失函数(Loss Function)的处理方式对模型的性能和优化过程有显著影响。本文以 re…...
opencv4.8 ubuntu20.04源码编译 安装报错记录
-- IPPICV: Downloading ippicv_2021.8_lnx_intel64_20230330_general.tgz from https://raw.githubusercontent.com/opencv/opencv_3rdparty/1224f78da6684df04397ac0f40c961ed37f79ccb/ippicv/ippicv_2021.8_lnx_intel64_20230330_general.tgz make -j8 到这咋不动了 代理配…...
16-03、JVM系列之:内存与垃圾回收篇(三)
JVM系列之:内存与垃圾回收篇(三) ##本篇内容概述: 1、执行引擎 2、StringTable 3、垃圾回收一、执行引擎 ##一、执行引擎概述 如果想让一个java程序运行起来,执行引擎的任务就是将字节码指令解释/编译为对应平台上的本地机器指令才可以。 简…...
在 Spring Boot 中使用 JPA(Java Persistence API)进行数据库操作
步骤 1: 添加依赖 在 pom.xml 文件中添加相关依赖: <dependencies><!-- Spring Boot Starter Web --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><…...
【sqlserver】mssql 批量加载数据文件 bulk copy使用
参考文章: Using bulk copy with the JDBC driver SqlServer数据批量写入 SqlServer批量插入数据方法–SqlBulkCopy sqlserver buld copy需要提供,数据文件的对应表的元数据信息主要的字段的位置、字段的名称、字段的数据类型。 执行bulk load时候不一…...
卷积神经网络(CNN)的层次结构
卷积神经网络(CNN)是一种以其处理图像和视频数据的能力而闻名的深度学习模型,其基本结构通常包括以下几个层次,每个层次都有其特定的功能和作用: 1. 输入层(Input Layer): 卷积神经网…...
使用Excel的COUNTIFS和SUMIFS函数进行高级数据分析
使用Excel的COUNTIFS和SUMIFS函数进行高级数据分析 引言 在处理数据时,Excel 提供了多种内置函数来帮助用户快速获取所需信息。其中,COUNTIFS 和 SUMIFS 是两个非常强大的多条件聚合函数,它们允许你根据一个或多个标准来统计或汇总数据。本…...
上传ssh公钥到目标服务器
创建密钥 ssh-keygen -t rsa -b 4096 -C "xxxx.xx"上传 sudo ssh-copy-id -i /Users/xx/.ssh/id_rsa.pub root127.0.0.1...
在visio2021 中插入MathType公式
首先要确保有着两个软件,且能用。 1、打开visio2021,之后点击“插入”-“对象” 2、打开后,选择MathType,确定 3、确定后就会弹出MathType编辑器...
【计算机视觉】图像的几何变换
最常见的几何变换有仿射变换和单应性变换两种,最常用的仿射变换有缩放、翻转、旋转、平移。 1. 缩放 将图像放大或缩小会得到新的图像,但是多出的像素点如何实现----插值 1.1 插值方法 最近邻插值 双线性插值 cv2.resize() 是 OpenCV 中用于调整图像…...
IS-IS四
目录 点到点中LSP(类似LSA)的同步过程 注意LSP只有(1类LSA和2类LSA) 查看详细信息:display isis lsdb 0000.0000.0001.00-00 verbose 开摸: ISIS的伪节点LSP(类似LSA)没有路由信息 L1路由器的路由计算…...
CODA 离线安装及虚幻镜迁移
1、离线安装 1.1 下载Miniconda安装脚本 wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh1.2 添加权限 chmod x Miniconda3-latest-Linux-x86_64.sh1.3 执行安装 ./Miniconda3-latest-Linux-x86_64.sh遇到问题,一路回车即可 1.4 …...
【Rive】混合动画
1 混合动画简介 【Rive】动画 中介绍了 Rive 中动画的基础概念和一般动画的制作流程,本文将介绍混合动画的基础概念和一般制作流程。Unity 中混合动画介绍详见→ 【Unity3D】动画混合。 混合动画是指同一时刻多个动画按照一定比例同时执行,这些动画控制的…...
软件体系结构复习-02 软件体系结构定位及构建
软件体系结构复习-02 软件体系结构定位及构建 原文链接:《软件体系结构复习-02 软件体系结构定位及构建》 目录 软件体系结构复习-02 软件体系结构定位及构建 1 什么是软件体系结构 2 软件生命周期中的软件体系结构 2.1 生命周期 2.2 定位与作用 1 规划和需求…...
MySQL-SQL语句
文章目录 一. SQL语句介绍二. SQL语句分类1. 数据定义语言:简称DDL(Data Definition Language)2. 数据操作语言:简称DML(Data Manipulation Language)3. 数据查询语言:简称DQL(Data Query Language)4. 数据控制语言:简称DCL(Data …...
Windows版Docker上不了网怎么办?
1、判断你的config文件、daemon文件的位置。 docker info命令输入, buildx: Docker Buildx (Docker Inc.) Version: v0.17.1-desktop.1 Path: C:\Users\AAA\.docker\cli-plugins\docker-buildx.exe 这个是你电脑这些文件的位置,修改linu…...
Zabbix监控Oracle 19c数据库完整配置指南
Zabbix监控Oracle 19c数据库完整配置指南 本文将详细介绍如何使用Zabbix配置Oracle 19c数据库监控,包括安装、配置、问题排查等全过程。本指南适合新手独立完成配置。 1. 环境准备 1.1 系统要求 Oracle 19c数据库服务器Zabbix服务器(版本5.0或更高&a…...
解决 Maven 部署中的 Artifact 覆盖问题:实战经验分享20241204
🛠️ 解决 Maven 部署中的 Artifact 覆盖问题:实战经验分享 📌 引言 在软件开发过程中,持续集成和持续部署(CI/CD)是提高开发效率和代码质量的关键手段。Hudson 和 Maven 是两种广泛使用的工具࿰…...
mb108里opengl相关
linux/linuxgdi.cpp里CreateWindowExW的 g_signal_connect(self->m_glArea, "render", G_CALLBACK(onRenderGlTextures), self); 绑定了一个渲染事件回调。 另外有 g_signal_connect(self->m_glArea, "realize", G_CALLBACK(onRealizeGlTextures)…...