linux
java匿名内部类内存泄露
一、java匿名内部类内存泄露
Java匿名内部类内存泄露
Java匿名内部类是一种特殊的内部类,它没有显式的类名,并且通常用于简化代码的书写。然而,使用匿名内部类时需要注意潜在的内存泄露问题。本文将探讨Java匿名内部类内存泄露的原因、影响以及解决方法。
为什么会发生内存泄露
Java匿名内部类持有对外部类的引用,如果在匿名内部类中持有外部类的实例引用,并且该外部类实例在匿名内部类的生命周期内不会被释放,则会导致内存泄露。这种情况下,外部类实例无法被垃圾回收器回收,从而造成内存泄露问题。
内存泄露的影响
内存泄露会导致程序运行时占用的内存空间持续增加,最终可能导致系统性能下降甚至程序崩溃。特别是在长时间运行的Java应用程序中,内存泄露问题会变得更加严重,严重影响系统稳定性和可靠性。
如何解决内存泄露问题
为了避免Java匿名内部类引起的内存泄露问题,可以采取以下几种方法:
- 尽量避免在匿名内部类中持有外部类的引用,减少引用链的长度。
- 使用弱引用或者静态内部类代替匿名内部类,避免持有外部类的强引用。
- 在不需要匿名内部类的时候手动释放外部类引用,及时清理资源。
结语
在Java编程过程中,要警惕匿名内部类可能引起的内存泄露问题。只有在深入理解匿名内部类的使用场景和注意事项的基础上,才能避免潜在的内存泄露风险,确保程序的稳定性和性能。希望本文对您有所帮助,谢谢阅读!
二、linux 内存分析
专业主题:内存分析
Linux内存分析,这是一项复杂的任务,但也并不那么难以处理。我们经常会遇到各种与内存相关的性能问题,比如内存泄漏、内存溢出等,这就需要我们进行内存分析。而要正确地进行内存分析,首先我们需要了解Linux系统的内存管理机制。
正文部分
在Linux系统中,内存被划分为不同的区域,每个区域都有其特定的用途。进程的地址空间、内核的虚拟内存空间、缓存等都是其中的一部分。而当我们在进行内存分析时,我们需要了解这些区域的特点以及如何使用相应的工具来分析。
首先,我们需要知道的是,Linux系统自带了一些强大的工具来进行内存分析,比如vmstat、free、top等。这些工具可以帮助我们了解系统的内存使用情况,从而判断是否存在内存泄漏等问题。当然,还有一些专业的工具,如valgrind、gprof等,这些工具可以提供更详细的分析结果。
其次,对于内存泄漏的问题,我们需要通过工具来查找内存泄漏的位置。常用的方法有使用工具进行内存dump,然后通过分析dump文件来确定泄漏的位置。另外,我们还可以通过查看进程的地址空间,来确定是否存在内存泄漏的可能。
再者,对于内存溢出的问题,我们需要考虑系统资源的使用情况。如果一个进程占用了过多的内存,就可能会导致系统资源的耗尽,从而影响系统的正常运行。因此,我们需要合理地管理进程的资源使用情况,避免出现内存溢出的问题。
结论部分
总的来说,Linux内存分析是一项重要的任务,但并不是那么难以处理。只要我们掌握了相关的工具和技巧,就能够有效地解决各种与内存相关的问题。对于专业的技术人员来说,熟练掌握这些工具和技巧是必不可少的。
三、linux内存分析
博客文章:Linux内存分析的重要性
随着Linux系统的广泛应用,内存管理问题逐渐成为用户关注的焦点。内存分析作为系统性能优化中至关重要的一环,能够准确地找出系统内存泄漏、内存使用不合理等问题,从而提高系统的稳定性与性能。今天,我们将探讨Linux内存分析的方法及其应用。
正文:Linux内存分析过程
Linux内存分析通常包括以下步骤:安装内存分析工具、启动系统监控、执行内存使用情况分析、识别问题并进行优化。其中,使用合适的工具是进行内存分析的关键。常见的内存分析工具有top、vmstat、free、sar等,它们能够提供系统内存使用情况的关键指标,帮助我们了解系统内存的整体状况。
关键字:linux、内存分析、工具、top、vmstat、free、sar
在执行内存分析时,我们还需要借助其他工具和技术来辅助分析,如使用系统日志、性能监控工具等。通过这些工具,我们可以更全面地了解系统内存的使用情况,从而发现潜在的问题并进行优化。此外,我们还可以通过调整系统配置参数来优化内存使用,提高系统的整体性能。
结论:Linux内存分析的实践
综上所述,Linux内存分析对于系统性能优化至关重要。通过合理的工具选择、技术应用和参数调整,我们可以准确找出系统内存问题并进行有效解决。在实践中,我们应熟练掌握这些方法,不断提高自己的内存分析能力,以确保系统的稳定性和性能。
参考文献
1. [引用文章1]:Linux系统性能优化最佳实践. (2023). 发表在《计算机应用》.
2. [引用文章2]:Linux内核分析与优化. (2024). 发表在《计算机技术与发展》.
四、linux php 内存泄露
Linux下PHP内存泄露问题解决方案
内存泄露一直是让开发者头疼的问题,特别是在使用PHP编写的应用程序中,更容易出现内存泄露的情况。本文将重点探讨在Linux环境下,如何解决PHP应用程序中的内存泄露问题。
1.了解内存泄露
在开始解决问题之前,我们首先需要确切了解内存泄露是什么。内存泄露指的是程序在运行过程中分配了内存空间,但并没有释放,导致系统中的可用内存不断减少,最终可能导致系统崩溃或变得非常缓慢。
2.PHP中的内存泄露
PHP是一种脚本语言,具有自动垃圾回收机制,但在某些情况下,仍然会出现内存泄露。常见的情况包括:
- 循环引用:当两个对象相互引用时,即使超出作用域,PHP的垃圾回收器也无法回收内存。
- 大内存分配:在处理大量数据时,未正确释放内存。
3.Linux环境下的解决方案
针对在Linux环境下的PHP内存泄露问题,以下是一些解决方案:
3.1.代码审查
通过代码审查可以及时发现潜在的内存泄露问题,特别是要注意循环引用的情况,及时解除不必要的引用关系。
3.2.使用内存检测工具
Linux环境下有许多内存检测工具可以帮助开发者检测内存泄露问题,如Valgrind、AddressSanitizer等。这些工具可以帮助定位内存泄露的具体位置,有助于快速解决问题。
3.3.优化代码逻辑
在编写PHP应用程序时,应确保程序逻辑简洁清晰,避免出现大量无效的内存分配。合理利用PHP提供的内置函数,如unset()函数可以用于释放不再使用的变量。
3.4.定期监控系统内存
通过Linux系统自带的监控工具,如top、free等,可以实时监控系统的内存占用情况。及时发现异常情况,并进行相应的处理。
4.总结
在Linux环境下,解决PHP内存泄露问题需要综合考虑代码质量、工具调试以及系统监控等方面。通过不断优化和改进,可以有效减少内存泄露问题对系统性能和稳定性造成的影响。
希望本文对大家解决Linux下PHP内存泄露问题有所帮助,欢迎留言交流!
五、linux系统内存管理
Linux系统内存管理
在Linux操作系统中,内存管理是一个至关重要的部分,涉及到系统的性能、稳定性以及资源利用率等方面。Linux系统通过一系列的机制来管理内存,确保系统能够高效运行并满足用户的需求。
内存管理的基本概念
内存管理涉及到诸多概念和机制,包括虚拟内存、物理内存、页面置换、内存分配等等。在Linux系统中,每个应用程序都会占用一定的内存空间,而系统需要合理地分配内存资源给不同的程序以及内核使用。以下是一些内存管理的基本概念:
- 虚拟内存: 是指操作系统为每个进程提供的抽象内存空间,使得每个进程都可以感觉到自己拥有一整块的连续内存空间。
- 物理内存: 直接映射到系统的物理RAM,是真实的内存空间。
- 页面置换: 当物理内存不足时,系统会将一部分内存数据写入硬盘中,以便为其他进程腾出空间。
- 内存分配: 系统需要管理内存的分配和释放,避免出现内存泄漏或者内存碎片等问题。
Linux系统中的内存管理机制
Linux系统采用了一系列的内存管理机制来保证系统的性能和稳定性。其中一些重要的机制包括页面置换、内存映射、页面回收等。通过这些机制,Linux系统可以高效地管理内存资源,提升系统的整体性能。
页面置换
页面置换是Linux系统中重要的内存管理机制之一。当物理内存不足时,系统需要将部分页面置换到硬盘上,以释放内存空间。Linux系统采用了一些经典的页面置换算法,如LRU(最近最少使用)算法、LFU(最少使用)算法等,来决定哪些页面应该被置换出去。
内存映射
内存映射是Linux系统中一种重要的机制,用于实现文件和内存之间的映射关系。通过内存映射,可以让文件直接映射到内存中,提高文件的访问速度。此外,内存映射还可以实现进程间的共享内存,方便进程之间的通信。
页面回收
Linux系统中的页面回收机制可以及时回收不再需要的页面,释放内存资源。这个过程是由Linux内核自动管理的,可以根据系统的运行情况来动态调整页面回收的策略,以保证系统的性能和稳定性。
结语
Linux系统内存管理是一个复杂而关键的部分,直接影响到系统的性能和稳定性。通过合理地管理内存资源,可以提升系统的整体表现,确保系统能够高效运行。希望本文对您了解Linux系统内存管理有所帮助。
六、linux释放gpu内存
博客文章:Linux释放GPU内存的方法
在当今的数字化时代,GPU(图形处理器)在许多领域中发挥着重要作用,包括人工智能、游戏和科学计算等。然而,当GPU内存被占用时,性能可能会受到影响。在Linux系统中,释放GPU内存是一个常见的问题,特别是在使用CUDA等框架时。在这篇文章中,我们将讨论如何释放Linux系统中的GPU内存。
释放GPU内存的重要性
GPU内存是影响计算机性能的关键因素之一。如果GPU内存被过度占用,系统的响应速度可能会变慢,甚至导致应用程序崩溃。通过释放GPU内存,我们可以提高系统的性能,并确保应用程序能够正常运行。
释放GPU内存的方法
在Linux系统中,有多种方法可以释放GPU内存。下面是一些常用的方法:
- 检查GPU内存使用情况:使用适当的工具(如nvidia-smi)可以查看GPU内存的使用情况,并确定哪些应用程序正在占用内存。
- 关闭不再使用的应用程序:如果某个应用程序正在占用GPU内存,可以尝试关闭它以释放内存。
- 优化代码:如果无法关闭应用程序,可以尝试优化代码以减少GPU内存的使用。例如,使用更高效的算法或数据结构可以减少内存占用。
- 使用显存管理工具:有一些显存管理工具可以帮助我们更好地控制GPU内存的使用。例如,使用NVML库可以更方便地管理显存。
总结
释放GPU内存对于提高Linux系统的性能至关重要。通过检查GPU内存使用情况、关闭不再使用的应用程序、优化代码和使用显存管理工具,我们可以更好地管理GPU内存,确保系统能够正常运行。
七、Linux内存管理原则
Linux内存管理原则
随着计算机技术的不断发展,操作系统在处理内存管理方面扮演着至关重要的角色。Linux作为一种开源操作系统,其内存管理原则是保证系统运行稳定、高效地利用内存资源、提高系统性能。本文将深入探讨Linux内存管理的基本原则,帮助读者更好地理解和应用于实际工作中。
首先,Linux内存管理的核心原则之一是适时释放内存资源。在系统运行过程中,程序会动态分配内存用于存储数据、指令和临时变量等,为避免出现内存泄漏等问题,系统需要及时释放不再需要的内存资源。通过合理的内存回收机制,可以减少内存紧张情况的发生,提高系统的稳定性和性能。
其次,Linux内存管理原则中重要的一环是内存的分配和释放要匹配。当程序申请内存空间时,系统应该分配对应大小的内存块;而当程序不再需要内存空间时,系统也应该及时将该内存块释放,避免内存浪费和碎片化问题。合理管理内存的分配与释放,对系统正常运行至关重要。
另外,Linux内存管理原则还包括内存的均衡分配和优化利用。在多任务操作系统中,不同进程之间共享系统的内存资源,为保证各进程运行的稳定性和效率,系统需根据各进程的需求分配合适大小的内存空间。通过内存的均衡分配和优化利用,可以提高系统的整体性能和资源利用率。
此外,Linux内存管理原则还强调内存的数据安全和完整性。内存中存储着程序运行所需的关键数据和代码,如发生数据篡改或内存错误,将会直接影响系统的运行和安全。因此,系统需要采取相应的措施确保内存数据的安全性和完整性,避免潜在的安全风险。
最后,Linux内存管理原则需要与硬件设备和应用程序紧密配合。硬件设备的不同对内存管理也会有所影响,系统需要根据硬件特性进行优化调整;而应用程序的内存使用情况也会直接影响系统的运行效果,因此需要针对性地进行内存管理调整。只有系统、硬件设备和应用程序三者之间互相配合,才能实现最佳的内存管理效果。
总之,Linux内存管理原则是系统稳定、高效运行的基石。通过遵循适时释放内存资源、分配和释放匹配、均衡分配和优化利用、数据安全和完整性、与硬件设备和应用程序配合等原则,可以有效提升系统的性能和稳定性,为用户提供更优质的使用体验。
八、Linux怎么查看内存?
要查看Linux系统的内存使用情况,可以使用命令"free"或者"cat /proc/meminfo"。
使用"free"命令可以直接显示系统的总内存、已使用内存、空闲内存以及缓冲区和缓存的情况。
而使用"cat /proc/meminfo"命令则可以查看更详细的内存信息,包括内存的总量、空闲量、缓存量、交换空间等。通过这些命令,可以快速了解系统的内存使用情况,及时进行优化和调整。
九、如何查看linux内存?
在Linux中,可以使用命令“free”来查看系统的内存使用情况。该命令将显示系统内存的总量、已使用的内存、可用的内存和被缓存的内存等信息。
此外,还可以使用“top”命令来查看系统中进程的内存使用情况,包括进程的PID、内存使用量和占用率等。
另外,还可以使用“ps aux”命令来查看进程的详细信息,包括进程的内存使用情况、CPU使用情况和占用率等。通过这些命令,可以帮助用户有效地监控系统的内存使用情况,及时发现并解决内存泄漏等问题。
十、linux cpu或者内存过高什么解决?
往期精彩回顾:全面剖析Linux kernel的调试debug技术
图文并茂:如何从零实现一个系统调用内存管理干货推荐:巨页HugePage
嵌入式工程师为什么要学习Qt?它的几种开发方式?聊聊2022年嵌入式开发就业前景
嵌入式开发Linux驱动篇——平台总线介绍及项目实战
linux CPU 过高,怎么排查问题
CPU 指标解析
- 平均负载
- 平均负载等于逻辑 CPU 个数,表示每个 CPU 都恰好被充分利用。如果平均负载大于逻辑 CPU 个数,则负载比较重
- 进程上下文切换
- 无法获取资源而导致的自愿上下文切换
- 被系统强制调度导致的非自愿上下文切换
- CPU 使用率
- 用户 CPU 使用率,包括用户态 CPU 使用率(user)和低优先级用户态 CPU 使用率(nice),表示 CPU 在用户态运行的时间百分比。用户 CPU 使用率高,通常说明有应用程序比较繁忙
- 系统 CPU 使用率,表示 CPU 在内核态运行的时间百分比(不包括中断),系统 CPU 使用率高,说明内核比较繁忙
- 等待 I/O 的 CPU 使用率,通常也称为 iowait,表示等待 I/O 的时间百分比。iowait 高,说明系统与硬件设备的 I/O 交互时间比较长
- 软中断和硬中断的 CPU 使用率,分别表示内核调用软中断处理程序、硬中断处理程序的时间百分比。它们的使用率高,表明系统发生了大量的中断
查看系统的平均负载
$ uptime
10:54:52 up 1124 days, 16:31, 6 users, load average: 3.67, 2.13, 1.79
- 10:54:52 是当前时间;up 1124 days, 16:31 是系统运行时间;6 users 则是正在登录用户数。而最后三个数字依次是过去 1 分钟、5 分钟、15 分钟的平均负载(Load Average)。平均负载是指单位时间内,系统处于可运行状态和不可中断状态的平均进程数
- 当平均负载高于 CPU 数量 70% 的时候,就应该分析排查负载高的问题。一旦负载过高,就可能导致进程响应变慢,进而影响服务的正常功能
- 平均负载与 CPU 使用率关系
- CPU 密集型进程,使用大量 CPU 会导致平均负载升高,此时这两者是一致的
- I/O 密集型进程,等待 I/O 也会导致平均负载升高,但 CPU 使用率不一定很高
- 大量等待 CPU 的进程调度也会导致平均负载升高,此时的 CPU 使用率也会比较高
【文章福利】小编推荐自己的Linux内核源码交流群:【869634926】整理了一些个人觉得比较好的学习书籍、视频资料共享在群文件里面,有需要的可以自行添加哦!!!前50名可进群领取!!!并额外赠送一份价值600的内核资料包(含视频教程、电子书、实战项目及代码)!!!
学习直通车:Linux内核源码/内存调优/文件系统/进程管理/设备驱动/网络协议栈
CPU 上下文切换
- 进程上下文切换:
- 进程的运行空间可以分为内核空间和用户空间,当代码发生系统调用时(访问受限制的资源),CPU 会发生上下文切换,系统调用结束时,CPU 则再从内核空间换回用户空间。一次系统调用,两次 CPU 上下文切换
- 系统平时会按一定的策略调用进程,会导致进程上下文切换
- 进程在阻塞等到访问资源时,也会发生上下文切换
- 进程通过睡眠函数挂起,会发生上下文切换
- 当有优先级更高的进程运行时,为了保证高优先级进程的运行,当前进程会被挂起
- 线程上下文切换:
- 同一进程里的线程,它们共享相同的虚拟内存和全局变量资源,线程上下文切换时,这些资源不变
- 线程自己的私有数据,比如栈和寄存器等,需要在上下文切换时保存切换
- 中断上下文切换:
- 为了快速响应硬件的事件,中断处理会打断进程的正常调度和执行,转而调用中断处理程序,响应设备事件
查看系统的上下文切换情况:
vmstat 和 pidstat。vmvmstat 可查看系统总体的指标,pidstat则详细到每一个进程服务的指标
$ vmstat 2 1
procs --------memory--------- --swap-- --io--- -system-- ----cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
1 0 0 3498472 315836 3819540 0 0 0 1 2 0 3 1 96 0 0
--------
cs(context switch)是每秒上下文切换的次数
in(interrupt)则是每秒中断的次数
r(Running or Runnable)是就绪队列的长度,也就是正在运行和等待 CPU 的进程数.当这个值超过了CPU数目,就会出现CPU瓶颈
b(Blocked)则是处于不可中断睡眠状态的进程数
# pidstat -w
Linux 3.10.0-862.el7.x86_64 (8f57ec39327b) 07/11/2021 _x86_64_ (6 CPU)
06:43:23 PM UID PID cswch/s nvcswch/s Command
06:43:23 PM 0 1 0.00 0.00 java
06:43:23 PM 0 102 0.00 0.00 bash
06:43:23 PM 0 150 0.00 0.00 pidstat
------各项指标解析---------------------------
PID 进程id
Cswch/s 每秒主动任务上下文切换数量
Nvcswch/s 每秒被动任务上下文切换数量。大量进程都在争抢 CPU 时,就容易发生非自愿上下文切换
Command 进程执行命令
怎么排查 CPU 过高问题
- 先使用 top 命令,查看系统相关指标。如需要按某指标排序则 使用
top -o 字段名
如:top -o %CPU
。-o
可以指定排序字段,顺序从大到小
# top -o %MEM
top - 18:20:27 up 26 days, 8:30, 2 users, load average: 0.04, 0.09, 0.13
Tasks: 168 total, 1 running, 167 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.3 us, 0.5 sy, 0.0 ni, 99.1 id, 0.0 wa, 0.0 hi, 0.1 si, 0.0 st
KiB Mem: 32762356 total, 14675196 used, 18087160 free, 884 buffers
KiB Swap: 2103292 total, 0 used, 2103292 free. 6580028 cached Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
2323 mysql 20 0 19.918g 4.538g 9404 S 0.333 14.52 352:51.44 mysqld
1260 root 20 0 7933492 1.173g 14004 S 0.333 3.753 58:20.74 java
1520 daemon 20 0 358140 3980 776 S 0.333 0.012 6:19.55 httpd
1503 root 20 0 69172 2240 1412 S 0.333 0.007 0:48.05 httpd
---------各项指标解析---------------------------------------------------
第一行统计信息区
18:20:27 当前时间
up 25 days, 17:29 系统运行时间,格式为时:分
1 user 当前登录用户数
load average: 0.04, 0.09, 0.13 系统负载,三个数值分别为 1分钟、5分钟、15分钟前到现在的平均值
Tasks:进程相关信息
running 正在运行的进程数
sleeping 睡眠的进程数
stopped 停止的进程数
zombie 僵尸进程数
Cpu(s):CPU相关信息
%us:表示用户空间程序的cpu使用率(没有通过nice调度)
%sy:表示系统空间的cpu使用率,主要是内核程序
%ni:表示用户空间且通过nice调度过的程序的cpu使用率
%id:空闲cpu
%wa:cpu运行时在等待io的时间
%hi:cpu处理硬中断的数量
%si:cpu处理软中断的数量
Mem 内存信息
total 物理内存总量
used 使用的物理内存总量
free 空闲内存总量
buffers 用作内核缓存的内存量
Swap 内存信息
total 交换区总量
used 使用的交换区总量
free 空闲交换区总量
cached 缓冲的交换区总量
- 找到相关进程后,我们则可以使用
top -Hp pid
或pidstat -t -p pid
命令查看进程具体线程使用 CPU 情况,从而找到具体的导致 CPU 高的线程 - %us 过高,则可以在对应 java 服务根据线程ID查看具体详情,是否存在死循环,或者长时间的阻塞调用。java 服务可以使用 jstack
- 如果是 %sy 过高,则先使用 strace 定位具体的系统调用,再定位是哪里的应用代码导致的
- 如果是 %si 过高,则可能是网络问题导致软中断频率飙高
- %wa 过高,则是频繁读写磁盘导致的。
linux 内存
查看内存使用情况
- 使用 top 或者 free、vmstat 命令
# top
top - 18:20:27 up 26 days, 8:30, 2 users, load average: 0.04, 0.09, 0.13
Tasks: 168 total, 1 running, 167 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.3 us, 0.5 sy, 0.0 ni, 99.1 id, 0.0 wa, 0.0 hi, 0.1 si, 0.0 st
KiB Mem: 32762356 total, 14675196 used, 18087160 free, 884 buffers
KiB Swap: 2103292 total, 0 used, 2103292 free. 6580028 cached Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
2323 mysql 20 0 19.918g 4.538g 9404 S 0.333 14.52 352:51.44 mysqld
1260 root 20 0 7933492 1.173g 14004 S 0.333 3.753 58:20.74 java
....
- bcc-tools 软件包里的 cachestat 和 cachetop、memleak
- achestat 可查看整个系统缓存的读写命中情况
- cachetop 可查看每个进程的缓存命中情况
- memleak 可以用检查 C、C++ 程序的内存泄漏问题
free 命令内存指标
# free -m
total used free shared buffers cached
Mem: 32107 30414 1692 0 1962 8489
-/+ buffers/cache: 19962 12144
Swap: 0 0 0
- shared 是共享内存的大小, 一般系统不会用到,总是0
- buffers/cache 是缓存和缓冲区的大小,buffers 是对原始磁盘块的缓存,cache 是从磁盘读取文件系统里文件的页缓存
- available 是新进程可用内存的大小
内存 swap 过高
Swap 其实就是把一块磁盘空间或者一个本地文件,当成内存来使用。swap 换出,把进程暂时不用的内存数据存储到磁盘中,并释放这些数据占用的内存。swap 换入,在进程再次访问这些内存的时候,把它们从磁盘读到内存中来
- swap 和 内存回收的机制
- 内存的回收既包括了文件页(内存映射获取磁盘文件的页)又包括了匿名页(进程动态分配的内存)
- 对文件页的回收,可以直接回收缓存,或者把脏页写回磁盘后再回收
- 而对匿名页的回收,其实就是通过 Swap 机制,把它们写入磁盘后再释放内存
- swap 过高会造成严重的性能问题,页失效会导致频繁的页面在内存和磁盘之间交换
- 一般线上的服务器的内存都很大,可以禁用 swap
- 可以设置 /proc/sys/vm/min_free_kbytes,来调整系统定期回收内存的阈值,也可以设置 /proc/sys/vm/swappiness,来调整文件页和匿名页的回收倾向
linux 磁盘I/O 问题
文件系统和磁盘
- 磁盘是一个存储设备(确切地说是块设备),可以被划分为不同的磁盘分区。而在磁盘或者磁盘分区上,还可以再创建文件系统,并挂载到系统的某个目录中。系统就可以通过这个挂载目录来读写文件
- 磁盘是存储数据的块设备,也是文件系统的载体。所以,文件系统确实还是要通过磁盘,来保证数据的持久化存储
- 系统在读写普通文件时,I/O 请求会首先经过文件系统,然后由文件系统负责,来与磁盘进行交互。而在读写块设备文件时,会跳过文件系统,直接与磁盘交互
- linux 内存里的 Buffers 是对原始磁盘块的临时存储,也就是用来缓存磁盘的数据,通常不会特别大(20MB 左右)。内核就可以把分散的写集中起来(优化磁盘的写入)
- linux 内存里的 Cached 是从磁盘读取文件的页缓存,也就是用来缓存从文件读写的数据。下次访问这些文件数据时,则直接从内存中快速获取,而不再次访问磁盘
磁盘性能指标
- 使用率,是指磁盘处理 I/O 的时间百分比。过高的使用率(比如超过 80%),通常意味着磁盘 I/O 存在性能瓶颈。
- 饱和度,是指磁盘处理 I/O 的繁忙程度。过高的饱和度,意味着磁盘存在严重的性能瓶颈。当饱和度为 100% 时,磁盘无法接受新的 I/O 请求。
- IOPS(Input/Output Per Second),是指每秒的 I/O 请求数
- 吞吐量,是指每秒的 I/O 请求大小
- 响应时间,是指 I/O 请求从发出到收到响应的间隔时间
IO 过高怎么找问题,怎么调优
- 查看系统磁盘整体 I/O
# iostat -x -k -d 1 1
Linux 4.4.73-5-default (ceshi44) 2021年07月08日 _x86_64_ (40 CPU)
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sda 0.08 2.48 0.37 11.71 27.80 507.24 88.53 0.02 1.34 14.96 0.90 0.09 0.10
sdb 0.00 1.20 1.28 16.67 30.91 647.83 75.61 0.17 9.51 9.40 9.52 0.32 0.57
------
rrqm/s: 每秒对该设备的读请求被合并次数,文件系统会对读取同块(block)的请求进行合并
wrqm/s: 每秒对该设备的写请求被合并次数
r/s: 每秒完成的读次数
w/s: 每秒完成的写次数
rkB/s: 每秒读数据量(kB为单位)
wkB/s: 每秒写数据量(kB为单位)
avgrq-sz: 平均每次IO操作的数据量(扇区数为单位)
avgqu-sz: 平均等待处理的IO请求队列长度
await: 平均每次IO请求等待时间(包括等待时间和处理时间,毫秒为单位)
svctm: 平均每次IO请求的处理时间(毫秒为单位)
%util: 采用周期内用于IO操作的时间比率,即IO队列非空的时间比率
- 查看进程级别 I/O
# pidstat -d
Linux 3.10.0-862.el7.x86_64 (8f57ec39327b) 07/11/2021 _x86_64_ (6 CPU)
06:42:35 PM UID PID kB_rd/s kB_wr/s kB_ccwr/s Command
06:42:35 PM 0 1 1.05 0.00 0.00 java
06:42:35 PM 0 102 0.04 0.05 0.00 bash
------
kB_rd/s 每秒从磁盘读取的KB
kB_wr/s 每秒写入磁盘KB
kB_ccwr/s 任务取消的写入磁盘的KB。当任务截断脏的pagecache的时候会发生
Command 进程执行命令
- 当使用 pidstat -d 定位到哪个应用服务时,接下来则需要使用 strace 和 lsof 定位是哪些代码在读写磁盘里的哪些文件,导致IO高的原因
$ strace -p 18940
strace: Process 18940 attached
...
mmap(NULL, 314576896, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f0f7aee9000
mmap(NULL, 314576896, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f0f682e8000
write(3, "2018-12-05 15:23:01,709 - __main"..., 314572844
) = 314572844
munmap(0x7f0f682e8000, 314576896) = 0
write(3, "\n", 1) = 1
munmap(0x7f0f7aee9000, 314576896) = 0
close(3) = 0
stat("/tmp/logtest.txt.1", {st_mode=S_IFREG|0644, st_size=943718535, ...}) = 0
- strace 命令输出可以看到进程18940 正在往文件 /tmp/logtest.txt.1 写入300m
$ lsof -p 18940
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
java 18940 root cwd DIR 0,50 4096 1549389 /
…
java 18940 root 2u CHR 136,0 0t0 3 /dev/pts/0
java 18940 root 3w REG 8,1 117944320 303 /tmp/logtest.txt
----
FD 表示文件描述符号,TYPE 表示文件类型,NODE NAME 表示文件路径
- lsof 也可以看出进程18940 以每次 300MB 的速度往 /tmp/logtest.txt 写入
linux 网络I/O 问题
当一个网络帧到达网卡后,网卡会通过 DMA 方式,把这个网络包放到收包队列中;然后通过硬中断,告诉中断处理程序已经收到了网络包。接着,网卡中断处理程序会为网络帧分配内核数据结构(sk_buff),并将其拷贝到 sk_buff 缓冲区中;然后再通过软中断,通知内核收到了新的网络帧。内核协议栈从缓冲区中取出网络帧,并通过网络协议栈,从下到上逐层处理这个网络帧
- 硬中断:与系统相连的外设(比如网卡、硬盘)自动产生的。主要是用来通知操作系统系统外设状态的变化。比如当网卡收到数据包的时候,就会发出一个硬中断
- 软中断:为了满足实时系统的要求,中断处理应该是越快越好。linux为了实现这个特点,当中断发生的时候,硬中断处理那些短时间就可以完成的工作,而将那些处理事件比较长的工作,交给软中断来完成
网络I/O指标
- 带宽,表示链路的最大传输速率,单位通常为 b/s (比特 / 秒)
- 吞吐量,表示单位时间内成功传输的数据量,单位通常为 b/s(比特 / 秒)或者 B/s(字节 / 秒)吞吐量受带宽限制,而吞吐量 / 带宽,也就是该网络的使用率
- 延时,表示从网络请求发出后,一直到收到远端响应,所需要的时间延迟。在不同场景中,这一指标可能会有不同含义。比如,它可以表示,建立连接需要的时间(比如 TCP 握手延时),或一个数据包往返所需的时间(比如 RTT)
- PPS,是 Packet Per Second(包 / 秒)的缩写,表示以网络包为单位的传输速率。PPS 通常用来评估网络的转发能力,比如硬件交换机,通常可以达到线性转发(即 PPS 可以达到或者接近理论最大值)。而基于 Linux 服务器的转发,则容易受网络包大小的影响
- 网络的连通性
- 并发连接数(TCP 连接数量)
- 丢包率(丢包百分比)
查看网络I/O指标
- 查看网络配置
# ifconfig em1
em1 Link encap:Ethernet HWaddr 80:18:44:EB:18:98
inet addr:192.168.0.44 Bcast:192.168.0.255 Mask:255.255.255.0
inet6 addr: fe80::8218:44ff:feeb:1898/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:3098067963 errors:0 dropped:5379363 overruns:0 frame:0
TX packets:2804983784 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:1661766458875 (1584783.9 Mb) TX bytes:1356093926505 (1293271.9 Mb)
Interrupt:83
-----
TX 和 RX 部分的 errors、dropped、overruns、carrier 以及 collisions 等指标不为 0 时,
通常表示出现了网络 I/O 问题。
errors 表示发生错误的数据包数,比如校验错误、帧同步错误等
dropped 表示丢弃的数据包数,即数据包已经收到了 Ring Buffer,但因为内存不足等原因丢包
overruns 表示超限数据包数,即网络 I/O 速度过快,导致 Ring Buffer 中的数据包来不及处理(队列满)而导致的丢包
carrier 表示发生 carrirer 错误的数据包数,比如双工模式不匹配、物理电缆出现问题等
collisions 表示碰撞数据包数
- 网络吞吐和 PPS
# sar -n DEV 1
Linux 4.4.73-5-default (ceshi44) 2022年03月31日 _x86_64_ (40 CPU)
15时39分40秒 IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s %ifutil
15时39分41秒 em1 1241.00 1022.00 600.48 590.39 0.00 0.00 165.00 0.49
15时39分41秒 lo 636.00 636.00 7734.06 7734.06 0.00 0.00 0.00 0.00
15时39分41秒 em4 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
15时39分41秒 em3 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
15时39分41秒 em2 26.00 20.00 6.63 8.80 0.00 0.00 0.00 0.01
----
rxpck/s 和 txpck/s 分别是接收和发送的 PPS,单位为包 / 秒
rxkB/s 和 txkB/s 分别是接收和发送的吞吐量,单位是 KB/ 秒
rxcmp/s 和 txcmp/s 分别是接收和发送的压缩数据包数,单位是包 / 秒
- 宽带
# ethtool em1 | grep Speed
Speed: 1000Mb/s
- 连通性和延迟
# ping www.baidu.com
PING www.a.shifen.com (14.215.177.38) 56(84) bytes of data.
64 bytes from 14.215.177.38: icmp_seq=1 ttl=56 time=53.9 ms
64 bytes from 14.215.177.38: icmp_seq=2 ttl=56 time=52.3 ms
64 bytes from 14.215.177.38: icmp_seq=3 ttl=56 time=53.8 ms
64 bytes from 14.215.177.38: icmp_seq=4 ttl=56 time=56.0 ms
- 统计 TCP 连接状态工具 ss 和 netstat
[root@root ~]$>#ss -ant | awk '{++S[$1]} END {for(a in S) print a, S[a]}'
LISTEN 96
CLOSE-WAIT 527
ESTAB 8520
State 1
SYN-SENT 2
TIME-WAIT 660
[root@root ~]$>#netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
CLOSE_WAIT 530
ESTABLISHED 8511
FIN_WAIT2 3
TIME_WAIT 809
网络请求变慢,怎么调优
- 高并发下 TCP 请求变多,会有大量处于 TIME_WAIT 状态的连接,它们会占用大量内存和端口资源。此时可以优化与 TIME_WAIT 状态相关的内核选项
- 增大处于 TIME_WAIT 状态的连接数量 net.ipv4.tcp_max_tw_buckets ,并增大连接跟踪表的大小 net.netfilter.nf_conntrack_max
- 减小 net.ipv4.tcp_fin_timeout 和 net.netfilter.nf_conntrack_tcp_timeout_time_wait ,让系统尽快释放它们所占用的资源
- 开启端口复用 net.ipv4.tcp_tw_reuse。这样,被 TIME_WAIT 状态占用的端口,还能用到新建的连接中
- 增大本地端口的范围 net.ipv4.ip_local_port_range 。这样就可以支持更多连接,提高整体的并发能力
- 增加最大文件描述符的数量。可以使用 fs.nr_open 和 fs.file-max ,分别增大进程和系统的最大文件描述符数
- SYN FLOOD 攻击,利用 TCP 协议特点进行攻击而引发的性能问题,可以考虑优化与 SYN 状态相关的内核选项
- 增大 TCP 半连接的最大数量 net.ipv4.tcp_max_syn_backlog ,或者开启 TCP SYN Cookies net.ipv4.tcp_syncookies ,来绕开半连接数量限制的问题
- 减少 SYN_RECV 状态的连接重传 SYN+ACK 包的次数 net.ipv4.tcp_synack_retries
- 加快 TCP 长连接的回收,优化与 Keepalive 相关的内核选项
- 缩短最后一次数据包到 Keepalive 探测包的间隔时间 net.ipv4.tcp_keepalive_time
- 缩短发送 Keepalive 探测包的间隔时间 net.ipv4.tcp_keepalive_intvl
- 减少 Keepalive 探测失败后,一直到通知应用程序前的重试次数 net.ipv4.tcp_keepalive_probes
文章参考:https://mp.weixin.qq.com/s/Y2-so8CFfXv5bM4sN4aJSw
热点信息
-
在Python中,要查看函数的用法,可以使用以下方法: 1. 使用内置函数help():在Python交互式环境中,可以直接输入help(函数名)来获取函数的帮助文档。例如,...
-
一、java 连接数据库 在当今信息时代,Java 是一种广泛应用的编程语言,尤其在与数据库进行交互的过程中发挥着重要作用。无论是在企业级应用开发还是...
-
一、idea连接mysql数据库 php connect_error) { die("连接失败: " . $conn->connect_error);}echo "成功连接到MySQL数据库!";// 关闭连接$conn->close();?> 二、idea连接mysql数据库连...
-
要在Python中安装modbus-tk库,您可以按照以下步骤进行操作: 1. 确保您已经安装了Python解释器。您可以从Python官方网站(https://www.python.org)下载和安装最新版本...