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

手机网站一般多宽建筑工人找活正规平台

手机网站一般多宽,建筑工人找活正规平台,那些网站做的非常好看的,昆明网络推广怎么做概述 项目制作过程中经常出现内存问题#xff0c;在该处对排查思路进行汇总#xff0c;也对常见问题进行总结#xff0c;以期待下一次遇到相似问题时可以快速排查#xff0c;然后解决问题 排查流程总结 首先检查内存的整体情况 使用工具htop和seme快速得知系统内存使用的…概述 项目制作过程中经常出现内存问题在该处对排查思路进行汇总也对常见问题进行总结以期待下一次遇到相似问题时可以快速排查然后解决问题 排查流程总结 首先检查内存的整体情况 使用工具htop和seme快速得知系统内存使用的全貌识别高内存占用进程 然后分析内存使用情况 检查系统内存和slab缓存使用/proc文件系统或者slabtop工具使用strace跟踪系统调用了解内存分配行为借助AddressSanitizer、Valgrind等工具检测潜在的内存问题 排查流程 检查内存情况 free -h free -h //查看内存的总量、已用、空闲和缓存的内存情况 shared多个进程共享的内存buff/cache用于文件缓存的内存available可用于启动新应用程序的内存包括缓存内存 top / htop 查看进程的实时内存消耗可以判断 vmstat 1命令 swpd已使用的交换空间free空闲内存buff/cache缓存和缓冲区内存si/so从交换区交换到内存或从内存交换到交换区的数据量bi/bo块输入和输出的数量us/sy/id用户空间、系统空间、空闲时间的CPU使用率 总结 通过上述方法可以从宏观角度了解到内存以及交换区的占用情况此时可以通过扩大内存、杀死不重要的进程、增加swap缓冲区来减少内存压力减少问题 分析进程的内存使用情况 htop总览 RES常驻内存集进程实际使用的物理内存包含共享的内存VIRT虚拟内存进程的虚拟内存总量包含所有分配给该进程的内存包括共享库、交换区等SHR共享内存进程使用的共享内存量%MEM进程的内存使用占系统总内存的百分比 smem命令总览 它能够显示更加详细和准确的内存信息特别是共享内存的处理上要比 ps 或 top 更加清晰 USS独占的私有内存Unique Set SizePSS共享内存分摊后的内存Proportional Set SizeRSS常驻内存集大小 查看所有进程 ps aux --sort-%mem 具体实现的功能与htop类似作为备用优先使用htop 查看某个特定进程的内存占用 ps -p pid -o pid,%mem,vsz,rss,cmd /proc文件系统进程细化 查看某个特定进程的内存使用情况 cat /proc/pid/status VmSize进程的虚拟内存大小VmRSS进程的常驻内存大小VmData进程的堆内存大小VmStk进程的栈内存大小VmExe进程的代码段大小VmLib共享库占用的内存VmSwap进程交换空间的使用情况 smaps更详细的内存映射可以进一步跟踪内存细节 cat /proc/pid/smaps 内存泄漏检测gdb valgrind 首先使用valgrind检查内存泄漏 valgrind --leak-checkfull ./(可执行文件多线程环境下查找内存问题 查看线程状态然后进入指定线程 (gdb) info threads(gdb) thread n查看内存问题以16进制格式查看my_variable变量32字的内存内容 (gdb) x/32xw my_variable 查看堆栈情况显示当前栈指针$sp地址处的20个字的内存内容 (gdb) x/20xw $sp 条件断点仅在特定条件下停止程序 设置一个断点当变量 my_var 的值等于 10 时触发 (gdb) break your_function if my_var 10 查看共享资源 (gdb) watch shared_variable slabtop 工具 slabtop 是一个实时监控工具用于查看内核中 slab 缓存的分配和使用情况。Slab 是一种内存分配机制内核通过它高效管理小块内存。Slab 分配器的高效性可能因内存碎片化而降低因此我们可以通过 slabtop 分析内存碎片 两种启动方式 slabtop // 实时刷新slabtop -o // 只查看一次 参数查询 OBJS: 总对象数量总计的分配内存单元ACTIVE: 活跃的对象数量当前正在使用的对象数量USE: 使用率表示 ACTIVE / OBJS 的百分比OBJ SIZE: 每个对象的大小字节SLABS: 分配的 slab 数量每个 slab 是多个对象的集合OBJ/SLAB: 每个 slab 中包含的对象数量CACHE SIZE: 缓存使用的总大小KBNAME: 缓存名称如 dentry 表示目录项缓存buffer_head 表示文件缓冲头 关键缓存名称查询 dentry: 目录项缓存与文件系统有关。如果此缓存过大且无法释放可能是某些程序频繁访问大量目录造成的inode_cache: 文件 inode 的缓存与文件系统的文件和目录节点有关kmalloc: 通用小块内存分配缓存可能存在碎片化buffer_head: 文件系统的数据缓冲头缓存 内存碎片的观察指标 查看 USE 列使用率如果使用率ACTIVE / OBJS较低远小于 100%则表示分配的 slab 中存在大量未使用的对象可能是内存碎片化的表现便捷方法按照USE进行排序slabtop -s u下列图2 检查 CACHE SIZE 列找出占用内存最多的缓存尤其是某些缓存大小持续增长而未释放的情况便捷方法按照缓存总大小进行排序图2slabtop -s c 持续监控  -n 1 表示每 1 秒刷新一次。-o 表示只输出一次结果避免实时刷新 watch -n 1 slabtop -o -s c strace 工具 用于跟踪程序执行时与内核交互的系统调用可以快速定位问题例如程序崩溃、权限错误、内存泄漏等 运行方式 直接运行程序跟踪 your_program 的所有系统调 strace ./your_program 附加到运行中的进程跟踪正在运行的进程 PID 的系统调用、 strace -p PID 输出到文件 使用 -o 选项将输出保存到文件 strace -o trace.log ./your_program 指定系统调用 只跟踪特定类型的系统调用如文件操作 strace -e traceopen,read,write ./your_program 常见选项 -e tracename只跟踪指定的系统调用例如 open, read, write 等-p PID附加到运行中的进程跟踪该进程的系统调用-o file将输出写入指定文件而不是直接打印到标准输出-t为每个系统调用添加时间戳-c统计各类系统调用的调用次数和执行时间-f跟踪子进程的系统调用-v打印完整的参数避免参数被截断-s len设置最大字符串长度默认是 32 字节更长的字符串可能被截断。可以通过此选项增加长度 具体使用 跟踪一个可执行程序并判断其问题 strace 可执行文件 跟踪一个网络请求 strace curl 网址 检测动态库加载问题进一步判断动态库加载错误的原因 strace -e traceopen ./your_program vmstat 工具 主要关注指标 如果 free 显示有空闲内存但程序分配大块内存失败可能是内存碎片化问题因为内存虽然总量充足但被分割成很多小块无法满足大内存请求如果 cache 和 buff 占用大量内存但应用程序仍然频繁使用交换空间si/so 非零或很高说明页缓存可能占用了大部分可用内存导致内存碎片化如果 free 有空闲内存但系统仍然频繁交换si/so 值较高可能是内存碎片造成的内存分配困难 具体使用 vmstat 1 1表示每秒刷新一次输出AddressSanitizer 工具 AddressSanitizer 与 Gperftools的区别使用 如果需要快速、高效地检测广泛的内存问题包括越界访问推荐 AddressSanitizer如果项目中使用了大量堆内存并需要深入分析分配行为同时优化性能推荐 Gperftools 主要功能 一种快速内存错误检测工具它通过编译时插桩和运行时监测机制来检测以下内存问题 越界访问访问数组/内存块的边界之外Use-After-Free释放内存后继续使用堆栈溢出访问堆栈帧外的内存全局溢出访问超出全局变量范围的内存 检测方法了解 ASan 将应用程序的内存划分为多个 块并为每个块创建一个 影子内存区域。每 8 字节的应用程序内存会对应 1 字节的影子内存用来标记内存块的状态有效、无效或越界区域。 分配内存时ASan 会在实际的内存块前后添加 红色区域Red Zones用于检测越界访问。任何访问红色区域的操作都会被 ASan 标记为越界访问。 插入检测代码每次内存访问都会检查对应的影子内存。如果发现访问超出了分配的边界或进入了红色区域ASan 会立即报告错误。 使用方法 gcc -fsanitizeaddress -g -o main main.ccGperftools 工具 基本了解 Gperftools 是一个性能分析和内存调试工具包其中的 HeapChecker 和 HeapProfiler 可以检测内存问题例如可以解决内存泄漏、越界访问等问题 具体使用 编译时链接 gcc -o program program.c -ltcmalloc Thread Sanitizer Thread Sanitizer是一种竞态检测工具可以直接检测内存竞态问题。程序运行的时候插桩检测线程 #include pthread.h #include stdio.h #include stdlib.hint counter 0;void *increment(void *arg) {for (int i 0; i 100000; i) {counter; // 存在竞态}return NULL; }int main() {pthread_t t1, t2;pthread_create(t1, NULL, increment, NULL);pthread_create(t2, NULL, increment, NULL);pthread_join(t1, NULL);pthread_join(t2, NULL);printf(Final counter value: %d\n, counter);return 0; } gcc -fsanitizethread -g -o tsan_test tsan_test.c -pthread ./tsan_test 常见问题总结 内存/交换区已满 free 命令中的空闲内存接近0系统可能会因为内存不足而出现 OOM (Out of Memory) 错误这时候操作系统会尝试通过交换空间来补充内存需求。如果交换空间也不足可能导致系统崩溃或进程被杀掉 关闭不必要的进程或服务增加物理内存或调整内存分配使用 swap 或增加交换空间来缓解压力 增加交换区内存通过交换空间增加swap空间 # 1. 创建交换文件 # 使用 fallocate 创建一个 2GB 的交换文件 echo 创建 2GB 的交换文件... sudo fallocate -l 2G /swapfile# 如果 fallocate 不可用可以用 dd 创建 # sudo dd if/dev/zero of/swapfile bs1M count2048# 2. 设置交换文件权限 echo 设置交换文件权限为 600仅限 root 访问... sudo chmod 600 /swapfile# 3. 格式化交换文件为 Swap echo 格式化交换文件为 Swap 类型... sudo mkswap /swapfile# 4. 激活交换文件 echo 激活交换文件... sudo swapon /swapfile# 5. 验证 Swap 是否增加 echo 验证新的 Swap 空间... free -h swapon --show# 6. 添加到 /etc/fstab 以永久生效 echo 添加到 /etc/fstab 以使配置永久生效... sudo bash -c echo /swapfile none swap sw 0 0 /etc/fstab 增加交换区增加交换区swap空间 # 提示用户手动操作分区 echo 以下步骤需要手动完成分区操作 echo 1. 使用 fdisk 或 parted 创建一个新的分区并将分区类型设置为 Swap (类型代码 82) echo 2. 格式化分区为 Swap 类型例如 echo sudo mkswap /dev/sdX echo 3. 激活 Swap 分区例如 echo sudo swapon /dev/sdX echo 4. 验证 Swap 是否增加 echo free -h echo 5. 添加到 /etc/fstab 以使配置永久生效例如 echo sudo bash -c echo \/dev/sdX none swap sw 0 0\ /etc/fstab echo 将 /dev/sdX 替换为实际分区路径。# 调整 swappiness 参数 echo 可选调整 Swap 使用策略swappiness # 当前 swappiness 设置默认为 60 echo 当前 swappiness 值 cat /proc/sys/vm/swappiness# 设置 swappiness 为 10减少使用 Swap 的倾向 echo 设置 swappiness 为 10... sudo sysctl vm.swappiness10# 永久生效修改 /etc/sysctl.conf 文件 echo 将 swappiness 设置永久生效... sudo bash -c echo vm.swappiness10 /etc/sysctl.conf 内存泄漏 总结 内存泄漏指的是程序在运行过程中动态分配了内存但未正确释放导致程序占用的内存不断增长。长时间运行后程序可能耗尽所有可用内存导致系统性能下降或崩溃 原因程序没有正确的调用释放内存函数或者内存引用丢失从而导致垃圾回收无法回收这些内存诊断工具valgrind 、 gdb 、memcheck 、 leaks解决办法通过堆栈信息通过内存泄漏工具查找内存泄漏的源头然后将这些内存释放即可 单线程环境下检测 编译可调式的代码使用valgrind进行内存检测 使用gdb进行调试 打断点然后开始调试  查看内存映射 Offset偏移量Perms权限Objfile对象文件该内存区域所映射的文件或对象的路径。如果为空表示这是匿名映射 总结多次运行程序检测堆区的起始地址是否在一直变大如果在一直变大的话那么就证明在分配新的内存而没有及时释放内存存在内存泄漏 多线程环境检测 编译程序并进入调试 总结切换到指定线程去检查在该线程的执行过程中是否出现了内存泄漏问题 内存碎片 总结 内存碎片是指系统的内存空间由于频繁的分配和释放操作导致可用内存分布不均虽然总的空闲内存足够但可能无法满足大的内存请求 原因动态内存分配器在长期运行后可能导致内存的碎片化尤其是在进行频繁的分配和释放操作时诊断top  free  vmstat  slabtop解决思路重新启动应用程序使用合适的内存分配策略例如内存池减少内存碎片的影响 解决思路总结 快速确认系统内存现状free 和 vmstat分析内核内存分配情况slabtop验证是否能分配大块内存stress 或手动分配释放缓存进行验证echo 3 /proc/sys/vm/drop_caches深入追踪程序行为strace 和 GDB一般是从服务器上无法解决问题的时候 具体实现 1. 使用free工具观察空闲区以及缓存区如果空闲区很多但是仍然分配失败那么就有可能是内存碎片 2. 使用vmstat检查内存动态变化着重关注cache是否占用过多无法释放的问题这样会导致碎片化 3. 使用 slabtop 检查内核内存碎片 4. 如果出现了上述问题那么进一步验证大内存的分配能力。通过stress分配大内存如果分配失败但是free还是显示有可用的内存内存碎片可以确定 stress --vm 1 --vm-bytes 1G 5. 清理缓存下面命令用于强制释放缓存 echo 3 /proc/sys/vm/drop_caches 跟踪程序的内存分配行为 使用strace跟踪内存分配或者也可以使用GDB进行跟踪验证内存的使用情况  strace -e tracememory ./your_program 内存访问越界 内存访问越界发生在程序试图读取或写入超出分配内存区域的地址。这种错误可能导致程序崩溃或数据损坏并且很难发现 原因程序存在数组越界、指针错误、未初始化的指针等问题诊断工具gdb \ valgrind \ AddressSanitizer \ gperftools解决通过工具定位越界位置然后针对性的解决 项目中快速解决内存访问越界 首先使用AddressSanitizer工具快速检测和定位内存越界问题如果文件较大可以选择使用gperftools工具然后逐步进行排查 然后运行程序并检查错误报告 最后对错误进行处理即可 虚拟内存过度使用 虚拟内存是操作系统为进程提供的一块抽象内存区域它可以包含物理内存和交换空间。当程序使用大量虚拟内存时系统可能会进行频繁的内存交换swap影响性能 原因程序使用了大量虚拟内存例如大数组、大数据结构但这些内存区域并没有完全映射到物理内存诊断工具top / vmstat / seme / ps 解决避免大规模内存映射调整交换空间配置减少内存交换的使用 具体解决思路 首先通过free命令查看交换空间的使用情况重点关注swap的总大小以及目前可用内存的大小 然后使用vmstat检查swap交换区的动态行为关注swap与si so的数值如果该数值持续为0那么就表明系统频繁的在使用交换区 最后使用htop工具找到占用内存高的进程可以将其杀死也可以选择拓展交换区空间具体根据自己需求而定 内存竞态 内存竞态发生在多线程程序中多个线程试图并发地读写共享内存区域而没有适当的同步机制。这可能导致数据不一致或崩溃 原因缺少适当的锁如互斥锁、读写锁等来保护共享内存导致竞态条件诊断工具lockstat / perf / thread sanitizer / valgrind / gdb解决使用正确的同步机制如互斥锁、条件变量等保护共享资源避免并发访问冲突 具体解决 使用ThreadSanitizer工具快速定位问题然后解决。如果是对程序成体性能或者内核开发的时候使用选择使用其他工具 内存映射文件问题 内存映射文件mmap是将文件或设备映射到进程的虚拟内存空间的技术。如果映射的文件过大或未正确管理可能导致内存访问异常或性能问题 原因错误的内存映射例如超出文件范围、内存映射文件的读取/写入不当、文件锁定等诊断strace / lsof / mmap / gdb解决检查 mmap 的使用确保映射范围正确避免使用过大的内存映射文件优化文件I/O操作 Kernel内存泄漏 内核中的内存泄漏可能比用户空间中的泄漏更加隐蔽和复杂通常出现在设备驱动、内核模块或系统调用中 原因内核模块中存在未释放的内存或者内核数据结构未正确释放诊断工具dmesg \ slabtop \ vmstat \ kmemleak解决使用内核工具检查 系统缓存和页缓存问题 Linux 会使用未使用的内存来缓存磁盘数据即页缓存这种缓存可以提高文件系统的性能但有时它会占用大量内存影响系统其他应用的内存需求 原因大规模的文件 I/O 操作导致大量内存用于缓存可能会影响其他进程的内存需求诊断工具free \ vmstat \ slabtop \ dmesg解决办法检查系统缓存配置调整 vm.swappiness 和 vm.drop_caches或者清理缓存以释放内存
http://www.dnsts.com.cn/news/189376.html

相关文章:

  • 个人网站课程设计报告网页设计教程详细步骤ppt
  • 北京网站设计案例百度竞价广告推广
  • 网站优化关键词价格58同城推广
  • 保定市住房保障和城乡建设局网站六安网站开发
  • 网站收缩引擎入口琼山网站制作
  • 建设银行网站介绍wordpress 如何安装
  • 网站建设公司哪好电商系统平台开发
  • 个人备案网站做app常州做网上废品收购网站
  • 做电商网站有什么用开发一个大型网站需要多少钱
  • 网站上线流程图打开网页就是2345网址导航
  • 长沙市住房和城乡建设局网站网站推广的技巧和方法
  • 家装设计风格seo网站设计就业前景
  • 做携程怎样的网站淘宝店铺怎么运营
  • 网站开发项目教程星河东莞网站建设
  • wordpress网站备份恢复桥西区网站建设
  • 转发文章赚钱的网站建设摄影比赛投稿网站
  • 绍兴酒店网站建设建小公司网站
  • 做网站公司济南怎么做网站结构拓扑图
  • 南京淄博网站建设方案鲜花商城网站设计
  • 免费软件下载官方网站南阳网站改版
  • 做百度快照要先有网站吗一键建站免费
  • 建设网站需要哪些硬件设施腾讯云备案网站建设方案书
  • 河南公司网站制作咨询网站文字大小代码
  • 杭州网站排名优化工具什么文案容易上热门
  • 高端网站建设设计公司有哪些长春建设
  • 网站显示系统建设中网站建设支出账务处理
  • wordpress加统计代码新的seo网站优化排名 网站
  • 网站制作和美工桂林东西巷介绍
  • 做变形字的网站建设网站申请空间需要多少钱
  • 学网站建设难网站每年都要续费吗