热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

shell编程实战之内存检查超过设定值杀死php-fpm进程-linux运维

公司之前购买过一个源码,写这个源码的工程师当时没有考虑全面,设计数据库表结构有点问题,当公司的数据达到几十万级别的时候,该网站基本就跑不动了。
公司之前购买过一个源码,写这个源码的工程师当时没有考虑全面,设计数据库表结构有点问题,当公司的数据达到几十万级别的时候,该网站基本就跑不动了。原因是查询的时候没有使用索引,造成了大量的数据库慢查询,服务器同时存在许多php-fpm进程运行。几乎耗尽了服务器cpu和内存。

当定位到问题后,重新设计了表结构,给对应的几个字段加上了索引。加上索引之后,还是偶尔会出现cpu、内存快耗尽的情况。对于这种情况,我编写了一个shell脚本,用来监控服务器内存的使用率,一旦达到预设值时,杀死所有的php-fpm进程,释放服务器的压力。

首先,我们要获取服务器的内存使用率。通过free可以获取总内存大小以及使用内存多少

# free 
              total        used        free      shared  buff/cache   available
Mem:        7999972     5432684      152496        2480     2414792     2284544
Swap:             0           0           0

我们需要的是Mem那行的,total以及used项。我们通过grep以及awk命令,可以获得当前系统的内存使用率。

free |grep -i mem | awk '{n=$3/$2; printf("%.0f", n * 100)}'

获得了内存使用率后,然后拿它和预设值作比较。当大于预设值时,就把系统中所以php-fpm进程杀死。那么接下来的工作就是如何找出系统中所有php-fpm进程,以及如何去杀死这些进程。

想要获取系统所有的php-fpm进程,可以使用ps命令,然后结合grep过滤即可。

ps aux | grep php-fpm | grep -v grep | grep -v master
www      21210  0.0  0.1 157852  8596 ?        S    19:33   0:00 php-fpm: pool www
www      21211  0.0  0.1 157852  8596 ?        S    19:33   0:00 php-fpm: pool www
……

通过上面的命令获取到了所有php-fpm进程,然后我们遍历这些信息,通过kill 进程号,来杀死php-fpm进程。

下面给出完整的shell脚本程序:

#!/bin/bash
# 内存检查,超过70%,杀死所有php-fpm进程
MEM_LIM=70

used=$(free | grep -i mem | awk '{n=$3/$2;printf("%.0f", n*100)}')

if ((used > MEM_LIM));then
    pids=`ps aux | grep php-fpm | grep -v grep | grep -v master | awk '{print $2}'`
    for pid in $pids
    do
       kill -9 $pid
    done
fi

上述的脚本是非常简单了,清晰命令。下面总结下该脚本程序使用了哪些知识点:

  • free命令获取内存使用率

  • ps命令获取所有php-fpm进程

  • kill命令杀死进程

  • shell编程条件分支以及循环结构

以上就是shell编程实战之内存检查超过设定值杀死php-fpm进程的详细内容,更多请关注 第一PHP社区 其它相关文章!


推荐阅读
  • 本文介绍了如何使用PHP代码实现微信平台的媒体素材上传功能,详细解释了API接口的使用方法和注意事项,确保文件路径正确以避免常见的错误。 ... [详细]
  • 在现代网络环境中,两台计算机之间的文件传输需求日益增长。传统的FTP和SSH方式虽然有效,但其配置复杂、步骤繁琐,难以满足快速且安全的传输需求。本文将介绍一种基于Go语言开发的新一代文件传输工具——Croc,它不仅简化了操作流程,还提供了强大的加密和跨平台支持。 ... [详细]
  • 网络运维工程师负责确保企业IT基础设施的稳定运行,保障业务连续性和数据安全。他们需要具备多种技能,包括搭建和维护网络环境、监控系统性能、处理突发事件等。本文将探讨网络运维工程师的职业前景及其平均薪酬水平。 ... [详细]
  • MySQL 数据库迁移指南:从本地到远程及磁盘间迁移
    本文详细介绍了如何在不同场景下进行 MySQL 数据库的迁移,包括从一个硬盘迁移到另一个硬盘、从一台计算机迁移到另一台计算机,以及解决迁移过程中可能遇到的问题。 ... [详细]
  • PHP 5.5.0rc1 发布:深入解析 Zend OPcache
    2013年5月9日,PHP官方发布了PHP 5.5.0rc1和PHP 5.4.15正式版,这两个版本均支持64位环境。本文将详细介绍Zend OPcache的功能及其在Windows环境下的配置与测试。 ... [详细]
  • 本文介绍如何在Linux服务器之间使用SCP命令进行文件传输。SCP(Secure Copy Protocol)是一种基于SSH的安全文件传输协议,支持从远程机器复制文件到本地服务器或反之。示例包括从192.168.45.147复制tomcat目录到本地/home路径。 ... [详细]
  • 本文详细介绍了 MySQL 中 LAST_INSERT_ID() 函数的使用方法及其工作原理,包括如何获取最后一个插入记录的自增 ID、多行插入时的行为以及在不同客户端环境下的表现。 ... [详细]
  • 本文探讨了如何在 PHP 的 Eloquent ORM 中实现数据表之间的关联查询,并通过具体示例详细解释了如何将关联数据嵌入到查询结果中。这不仅提高了数据查询的效率,还简化了代码逻辑。 ... [详细]
  • 本文介绍如何通过SSH协议使用Xshell远程连接到Ubuntu系统。为了实现这一目标,需要确保Ubuntu系统已安装并配置好SSH服务器,并保证网络连通性。 ... [详细]
  • 本文介绍如何在现有网络中部署基于Linux系统的透明防火墙(网桥模式),以实现灵活的时间段控制、流量限制等功能。通过详细的步骤和配置说明,确保内部网络的安全性和稳定性。 ... [详细]
  • 作者:守望者1028链接:https:www.nowcoder.comdiscuss55353来源:牛客网面试高频题:校招过程中参考过牛客诸位大佬的面经,但是具体哪一块是参考谁的我 ... [详细]
  • 在Python开发过程中,随着项目数量的增加,不同项目依赖于不同版本的库,容易引发依赖冲突。为了避免这些问题,并保持开发环境的整洁,可以使用Virtualenv和Virtualenvwrapper来创建和管理多个隔离的Python虚拟环境。 ... [详细]
  • PostgreSQL 10 离线安装指南
    本文详细介绍了如何在无法联网的服务器上进行 PostgreSQL 10 的离线安装,并涵盖了从下载安装包到配置远程访问的完整步骤。 ... [详细]
  • 本文详细介绍了如何在云服务器上配置Nginx、Tomcat、JDK和MySQL。涵盖从下载、安装到配置的完整步骤,帮助读者快速搭建Java Web开发环境。 ... [详细]
  • docker镜像重启_docker怎么启动镜像dock ... [详细]
author-avatar
休息一下狂想曲
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有