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

【Linux学习】性能监控所遇到的一些知识点

多进程和多线程的上下文切换比较

多进程和多线程都涉及到上下文切换,但它们之间的区别在于上下文切换的成本。

在多进程的情况下,每个进程都有自己独立的地址空间,因此进程之间的通信需要使用IPC(Inter-Process Communication)机制,这会导致较高的开销。另外,在进程间切换时,操作系统需要将当前进程的所有状态信息保存到内存中,并加载新进程的状态信息,这也需要较大的时间和资源消耗。

而在多线程的情况下,所有线程共享同一个地址空间,因此线程之间的通信更为方便快捷,可以直接读写内存数据,而不需要进行IPC。另外,在线程间切换时,只需要保存当前线程的部分状态信息(如程序计数器、寄存器等),并加载新线程的状态信息,相比起进程切换来说,消耗的资源和时间要少得多。

因此,虽然多进程和多线程的上下文切换都会带来一定的成本,但基于线程的并发通常比基于进程的并发拥有更低的上下文切换成本。

怎么修改交换分区

交换分区(Swap Partition)是计算机硬盘中为内存扩充服务的一部分空间,在内存不足时,操作系统可以将一部分数据和程序从内存中移到交换分区中,以此释放内存空间供其他程序使用。这个过程被称为交换(Swapping),因此交换分区也被称为交换文件(Swap File)或交换区(Swap Space)。

交换分区的意义在于帮助解决内存不足的问题,尤其是在运行大型程序或多任务操作时,可用内存可能会很快耗尽。通过使用交换分区,操作系统可以将不常用的数据和程序暂时存储在硬盘上,以便腾出更多的内存空间,使得正在执行的程序能够继续工作,并保证系统的稳定性。
临时修改:

swapoff -a 

永久修改:

vim /etc/sysctl.conf

添加以下内容vm.swappness=0

重新加载内核参数

sysctl -p

一些与OOM相关的运维面试题

什么是OOM(Out of Memory)?它是如何发生的?

如何检测服务器是否遭受了OOM?

在Linux系统中,如何查看进程的内存使用情况?

使用哪些工具可以帮助诊断OOM问题?

当出现OOM问题时,应该采取哪些措施来解决问题?

如何通过调整内核参数来预防OOM问题?

如何限制进程的内存使用?

如何分析JVM堆内存溢出并解决该问题?

如何针对MySQL数据库进行内存优化,以避免OOM问题?

在Kubernetes集群中,如何处理OOM事件?

参考回答:
OOM(Out of Memory)指的是操作系统无法分配更多的内存空间给进程使用时发生的情况。这通常会导致进程崩溃或被杀死。

有多种方法可以检测服务器是否遭受了OOM,包括查看系统日志、使用系统监控工具等。

在Linux系统中,可以使用命令"top"、“ps”、"free"和"vmstat"来查看进程的内存使用情况。

可以使用工具如"sysstat"、“perf”、“gdb”、"strace"和"lsof"等来帮助诊断OOM问题。

当出现OOM问题时,应该采取以下措施来解决问题:a) 通过增加物理内存或交换空间来扩展可用内存;b) 通过限制进程内存使用或调整内核参数来防止OOM问题再次发生;c) 分析并优化代码或应用程序以减少内存占用。

可以通过调整内核参数如"vm.overcommit_memory"、"vm.overcommit_ratio"来预防OOM问题。

可以使用命令"ulimit"或"cgroups"来限制进程的内存使用。

针对JVM堆内存溢出问题,可以通过调整JVM的-Xmx参数来扩展堆内存大小,或通过分析Heap Dump文件来定位问题。

针对MySQL数据库的内存优化,可以通过调整key_buffer_size、innodb_buffer_pool_size等参数来优化内存使用,避免OOM问题的发生。

在Kubernetes集群中,可以通过使用资源限制和请求、削减pod数量、设置容器探针等方式来处理OOM事件,并在出现OOM时进行自动重启。同时,也可以通过配置节点主机上的系统参数如vm.swappiness和kernel.panic_on_oom来防止OOM问题对整个集群产生影响。

怎么刷新buff/cache

在Linux系统中,可以使用以下命令来刷新buff/cache:

sync:将数据从操作系统的缓存写入磁盘,不会清空缓存。

echo 1 > /proc/sys/vm/drop_caches:丢弃页缓存(pagecache),但不影响其他类型的缓存,如目录项缓存(dentry cache)和索引节点缓存(inode cache)。

echo 2 > /proc/sys/vm/drop_caches:丢弃目录项缓存和页缓存,但不影响索引节点缓存。

echo 3 > /proc/sys/vm/drop_caches:丢弃所有缓存,包括页缓存、目录项缓存和索引节点缓存。

请注意,在生产服务器上直接清除缓存可能会对性能产生负面影响。如果需要清除缓存并避免对性能产生负面影响,建议使用第一种方法,即sync命令。

page in 和page out

“Page in” 和 “page out” 是与虚拟内存(virtual memory)有关的概念。

在使用虚拟内存的操作系统中,物理内存(RAM)的空间是有限的,而进程需要的内存空间可能会超过物理内存的大小。因此,操作系统会将一部分不常用的数据从物理内存中转移到磁盘上的交换文件(swap file)中,这个过程叫做“page out”,也称为“换出页”。

当进程再次需要那些被转移到交换文件中的数据时,操作系统会将它们重新载入到物理内存中,这个过程叫做“page in”,也称为“换入页”。

总的来说,“page out”是将数据从物理内存转移到磁盘上的过程,而“page in”则是将数据从磁盘上重新载入到物理内存中的过程。
大量的"Page in" 和 "page out"可能意味着系统正在经历内存压力(memory pressure)。

内存压力是指系统中的物理内存不足以满足进程的需要,因此操作系统需要将一些不常用的数据转移到磁盘上的交换文件中,以腾出物理内存。这个过程会降低系统的性能,因为访问磁盘比访问内存慢得多。

如果系统中出现了大量的"Page in" 和 “page out”,可以考虑以下几种解决方法:

增加物理内存:增加物理内存可以减少内存压力,从而减轻"Page in" 和 “page out” 的负担。

优化应用程序:某些应用程序可能占用过多的内存,导致系统内存不足。通过优化应用程序可以减少内存使用量。

关闭不必要的应用程序:关闭不必要的应用程序可以释放一些物理内存,从而减轻内存压力。

调整交换文件设置:如果交换文件设置不合理,也可能导致大量的"Page in" 和 “page out”。可以尝试调整交换文件大小或位置,以优化系统性能。

监控软件网络流量监控和分析

需要在网络设备上开启SNMP协议,并进行配置才能正常工作。
SNMP(Simple Network Management Protocol)是一种用于管理和监控网络设备的协议,它可以通过查询网络设备上的MIB(Management Information Base)获取设备状态和性能信息。Zabbix和Prometheus都支持通过SNMP协议获取网络设备的性能数据,例如带宽使用率、错误率、丢包率等信息。

在使用Zabbix或Prometheus进行网络流量监测时,需要对网络设备进行SNMP配置,并添加相应的监测项。具体步骤如下:

在网络设备上启用SNMP协议,并设置SNMP Community String。这个字符串类似于密码,用于验证Zabbix或Prometheus对设备的访问权限。

在Zabbix或Prometheus中添加SNMP设备。在Zabbix中,可以通过“Configuration”菜单下的“Hosts”选项卡添加SNMP设备;在Prometheus中,可以添加SNMP exporter并指定设备地址和Community String。

添加监测项。在Zabbix中,可以通过“Configuration”菜单下的“Items”选项卡添加监测项,例如CPU利用率、带宽使用率等;在Prometheus中,可以通过修改配置文件添加相应的监测规则。

可以创建警报并设置阈值,当设备性能数据超出阈值时,Zabbix或Prometheus会发送警报通知管理员。

netstat -anplut

“-a”:显示所有连接和侦听端口,包括未建立连接的。
“-n”:以数字形式显示地址和端口号,而不是解析成域名和服务名称。
“-p”:显示与每个套接字关联的进程信息。
“-l”:只显示侦听状态的套接字。
“-u”:只显示UDP协议的套接字。
“-t”:只显示TCP协议的套接字。

编写一个脚本监控某台服务器(自己的虚拟机)的十个端口开放情况(用nc命令)

shell脚本

# 定义要监视的端口列表
host_ip=8.219.110.232
port_list=(22 80 3306 6379 53 21 8000 9000 10000)

# 循环遍历端口列表并检查是否打开
for port in "${port_list[@]}";
do
        ctime=$(date +%Y%m%d%H%M%S)
        if nc -w 1 -z "$host_ip" "$port"
        then
                echo "$ctime web server $host_ip:$port is up"|tee -a  /var/log/web_server_160.log
        else
                echo "$ctime web server $host_ip:$port is down"|tee -a  /var/log/web_server_160.log

        fi
        sleep 1
done


http://www.kler.cn/news/18587.html

相关文章:

  • 【Nodejs】Express实现接口
  • Vue3学习笔记
  • 运维——ssh无法登录云服务器
  • 静态库和动态库的制作与使用
  • 【异常解决】vim编辑文件时提示 Found a swap file by the name “.start.sh.swp“的解决方案
  • http简述
  • java初学(学习中)
  • spring-transaction源码分析(3)Transactional事务失效原因
  • java版企业电子招投标采购系统源码之首页设计
  • Line Renderer组件
  • 【React】React-router路由
  • MySQL【存储过程与存储函数】
  • 操作系统基础知识介绍之指令集体系结构:RISC-V寄存器(掺杂与ARM和X86部分比对)
  • 羡慕!因工作琐事太多,女子果断从体制内裸辞
  • 使用FastAPI构建高效Python Web应用程序的详细教学
  • HBase:Hadoop生态系统中的分布式NoSQL数据库【上进小菜猪大数据系列】
  • 安装gitea
  • 【web】HTTP工作原理及应用
  • 基于SpringBoot的线上日志阅读器
  • Midjourney生成LOGO指南
  • 静态代码块、实例代码块、构造方法的执行顺序
  • Linux介绍及环境搭建
  • Liunx 使用命令连接Redis
  • 关于 std::condition_variable
  • web之iframe的那些事、打开外链、窗口、嵌入、iframe、location、href、replace、open、assign
  • KingbaseES V8R6备份恢复系列之 -- system-Id不匹配备份故障
  • Java引用类型(强引用,软引用,弱引用,虚引用)
  • 运维高可用架构的 6 大常规方案
  • 重新定义座舱智能化的下半场?谁能抓住弯道超车的窗口期
  • 《Kubernetes证书篇:基于cfssl工具集一键生成二进制kubernetes集群相关证书(方法一)》