展开

关键词

故障分析 | MySQL OOM 故障应如何下手

它打分的算法如下:某个进程和它所有的子进程都占用了很多内存的将会打个高分。为了释放足够的内存来解决这种情况,将杀最少数量的进程(最好是个进程)。内核进程和其他较重要的进程会被打相对较低的分。 许许多多辈的的经验中了解到,此参数的值设置为物理内存的 50%~80% 颇为合理。 举个栗子:? 结果可想而知,这个实例运行中经常被 oom-killer 杀,想必原因即是因为开始 MySQL 自身的内存规划欠妥。 此外,内存泄漏通常不会接产生可观察的错误症状,而是逐渐积累,降低系统整体性能,极端的情况下可能使系统崩溃。上文说到内存泄漏具有隐蔽性,就是不容易被发现呗......为奈何? 标配了许多有用的工具:Memcheck 是内存错误检测器。Cachegrind 是个缓存和分支预测探查器。Callgrind 是个生调用图的缓存分析器。Helgrind 是线程错误检测器。

33520

使用 Valgrind 检测 CGI 内存泄漏的简易方法

项目中使用了基于CGIEx构建的CGI,并且通过CGI调用Protobuf API来些动态解析proto定义类的功能,上线使用Valgrindmemcheck工具检测CGI是否存内存泄漏的风险 Valgrind的使用十分简单,通过设置定的参数启动二进制可执行程序,并且执行结束后收集结果输出即可。 但是我们的CGI是通过Apache运行的,不能接使用Valgrind启动,Google后没有找到相关的实践,只好自己动手。 分析到这里,现大致可以确定如何接启动CGI二进制文件并输入参数了。 -track-origins=yes .cgi_post_sample 输入json格式字符串参数{id:1024,name:calvin} 查看valgrind_report.log中的结果输出测试

80000
  • 广告
    关闭

    90+款云产品免费体验

    提供包括云服务器,云数据库在内的90+款云计算产品。打造一站式的云产品试用服务,助力开发者和企业零门槛上云。

  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    内存检测王者剑—valgrind

    Valgrind由内核(core)以及基于内核的其他调试工具组。 内核类似于个框架(framework),它模拟了个CPU环境,并提供服务给其他工具;而其他工具则类似于插件 (plug-in),利用内核提供的服务各种特定的内存调试任务。 位于这段中的数据,内核执行该程序,将其初始化为0或者null。例如出现任何函数外的全局变量:int sum;(4)堆(Heap)。 1.Valid-Value 表:对于进程的整个地址空间中的每个字节(byte),都有与对应的 8 个 bits;对于 CPU 的每个寄存器,也有个与对应的 bit 向量。 调用Valgrind的通用格式是:valgrind your-prog 2.Valgrind 的参数分为两类,类是 core 的参数,它对所有的工具都适用;另外类就是具体某个工具如 memcheck

    13920

    内存、性能问题分析的利器——valgraind

    valgrind个知名的分析软件集。我们可以使用它进行内存、多线程及性能等各种问题的分析。它采用非侵入方式,所谓非侵入方式是指:我们不用代码中插入分析工具的库。 因为如果要将工具编译到文件中,或者要调用其提供的些API,才能进行问题分析,无疑增大了用户的学习和使用本。 valgrind-options是valgrind些参数,最常用的是--tool=【tool_name】。我们可以使用不同的tool进行不同的分析,比如使用memcheck进行内存问题分析。 当待分析程序片段第次被执行时,valgrind会将代码片段交给工具——比如内存调试时使用的memcheck处理,工具会代码中插入些辅助分析的代码片段。 新的代码会valgrind模拟出的CPU上执行。然后valgrind会结合读取到的待执行程序和其所关联的库文件的调试信息,输出分析结果。

    36120

    valgrind使用介绍

    vim ~.bashrc #将bin文件夹的路径放置.bashrc文件最后image.png#使改变生效 source ~.bashrc至此,valgrind的安装。 二、 valgrind工具介绍Memcheck是内存错误检测器。它可以帮助您使程序,尤其是用C和C ++编写的程序更加正确。Cachegrind是个缓存和分支预测探查器。它可以帮助您使程序运行更快。 如果没有调试信息,即使最好的valgrind工具也将只能够猜测特定的代码是属于哪个函数。打开调试选项进行编译后再用valgrind检查,valgrind将会给出具体到某行的详细报告。 这些优化选项可能会使得memcheck提交错误的未初始化报告,因此,为了使得valgrind的报告更精确,编译的时候最好不要使用优化选项。 其他关于gcc的参数可参考https:www.runoob.comw3cnotegcc-parameter-detail.html四、log内容组介绍:(1)版本信息==28431== Memcheck

    37320

    nginx下使用asan和valgrind两个静态检查工具

    -3.12.0.tar.bz2 cd valgrind-3.12.0 .configure makesudo make install输入valgrind–h显示valgrind的参数及提示,说明安装功 topicopenrestyriEO_YXTwz4 sudo valgrind --tool=memcheck --leak-check=full usrlocalnginx-1.4.2sbinnginx 编译脚本做下面的修改:export LUAJIT_INC=usrlocalincludeluajit-2.1启动方式sudo valgrind --tool=memcheck .sbinnginx - ,并spanner的日志文件error.log中打印相关的问题,以及问题的调用栈信息。 线上生的调用栈只有函数地址,没有符号信息,可以将生的调用栈弄下来,

    70330

    valgrind使用:检测内存泄漏

    1 什么是内存泄漏c语言中,需由开发者负责内存的申请和释放,内存泄漏是指开发者程序中使用动态内存分配函数xxlloc堆(heap)上申请内存,内存使用毕后未使用free函数释放,那么这块内存程序退出都不能再次使用 ,导致内存使用逐渐增大,至耗尽,程序异常退出。 若新内存空间比p指向的内存大,则p指向的内存的内容不变,反内存被截取。增加的新内存不被初始化。返回指向新内存的指针,若分配失败,返回NULL,p指向的内存空间的内容不变。 void free(void *p): 释放p指向的内存空间,使用free函数,必须确保p是指向由xxlloc分配的内存空间。当p=NULL,该函数不执行任何操作。 ,造内存泄漏。

    923130

    Linux下检测内存泄露的工具 valgrind

    Valgrind是运行Linux上套基于仿真技术的程序调试和分析工具,它包含个内核,个软件合的CPU,和系列的小工具。每个工具都可以项任务—调试分析或测试等。 运行结束时,它会把分析数据写入个文件,callgrind_annotate可以把这个文件的内容转化可读的形式。 Helgrind寻找内存中内对个线程访问,而又没有贯加锁的区域。这些区域往往是线程间失去同步的情况,而且会导致难以发掘的错误。 valgrind中的memcheck:调用时还可以加上tool:  $valgrind –tool=memcheck .malloc? 4.missif的使用跟cachegrind类似,只不过生的文件不样,生的是massif.pid.ps的PostScript文件,里面只有副描述堆栈使用情况的彩图。

    2.5K90

    Valgrind 使用入门

    安装valgrind --version 输出版本号;3. 工具使用:3.1 内存泄漏检测:a. 正常编译目标程序 (如 g++ -g -o valgrind_tst main.cpp),官方推荐加上 -g 选项;b. valgrind --tool=memcheck --leak-check=full --tool=memcheck 表示使用工具集中的内存检测,其他选项参考 valgrind -h;d. 特别的 --trace-children = yes 开启这个选项将使 valgrind 追踪到子进程,但据说不是很好用,所以我般将服务设置为台运行,如果你的后台服务(daemon 进程)无法设置台运行 查看结果,运行后,将输出 callgrind.out.PID 文件,该文件可被 gprof2dot 等工具解析转化为 dot,再由 dot 转化为图片输出,也可以接用 callgrind_annotate

    4.4K00

    程序异常分析指南

    *ptr; long buffer = 0; 缓冲区溢出攻击 ptr++; }虽然只是修改了个字符,但是行为已经和的代码全不同了。 锁不会导致边所述的接导致程序崩溃的异常,而是会挂起进程的线程,从而导致程序的部分任务卡,不能提供正常的服务。最典型的锁产生方式,就是熟知的ABBA锁。? 还有种办法就是提预知该情况的发生,不使用两个锁同步线程,这就需要人工费力地排查潜锁可能,当然,也有分析工具帮助开发者此类工作,稍后会作介绍。 使用print命令打印ptr指针的值,确实为0,与我们的讨论致。 第27和48显示:线程2和3(主线程编号为1)退出时仍然格持有1个锁,很明显,这两个线程相互锁了,与的讨论致。

    1.6K31

    内存问题分析的利器——valgraind的memcheck

    《内存、性能问题分析的利器——valgraind》文中我们简单介绍了下valgrind工具集,本文将使用memcheck工具分析各种内存问题。 4个字节被违例写入,第三行显示写入的位置分配的16个字节后。 4个字节被违例读取,第三行显示读取的位置分配的16个字节后。 如果把个负数看个无符号类型的数,则可以表达出极大数,比如0xFFFFFFFF(无符号值4294967295,有符号值-1),因为它们的底层二进制值是致的。        有事我们调用内存分配时,不小心将空间大小设置为个负数,就要求申请个极大的空间,这明显是有问题的。

    38510

    linux安装valgrind

    转载请注明出处:帘卷西风的专栏(http:blog.csdn.netljxfblog)       最近服务器程序出了个崩溃,确定是内存地址访问越界,但是不能定位哪里,没办法只好用valgrind 来跑下,以公司的服务器是上都默认安装了,突然发现云服务器上没有安装这个软件,所以记录下如何安装。 .tar.bz2,解压后生目录valgrind-3.11.0。      目支持的平台,官网上列表如下:      {x86,amd64,arm,ppc32,ppc64,s390x,mips32,mips64}-linux, arm-android (2.3 and later valgrind      # make      # make install      4、到这来已经安装功了,但还不能接使用,需要创建个软连接。

    1.3K10

    你的代码有内存泄漏!

    言 最近进行词典笔的离线解码器测试,遇到了各种内存泄漏以及崩溃问题,为了协助开发定位问题,用到了Valgrind和BreakPad工具,下面就简单介绍下这两个小工具吧。 .Valgrind 1.Valgrind简介 Valgrind款用于内存调试、内存泄漏检测以及性能分析、检测线程错误的软件开发工具。 Valgrind 可以运行Linux 上的多用途代码剖析和内存调试软件。主要包括Memcheck、Callgrind、Cachegrind 等工具,每个工具都能项任务调试、检测或分析。 cd valgrind-3.16.0 .configure make &&make install 编译好后检查是否安装 valgrind --version 3.Valgrind使用valgrind 调整目录结构 为了可以使用 minidump_stackwalk工具来生stack trace,你需要将文件放置定的目录结构,symbol file的第行说明了需要放置的目录结构,可以使用head

    24931

    Rust FFI 编程 - 手动绑定 C 库入门 04

    本篇,我们说明 Rust 调用 C 的另外种场景:内存 Rust 这边分配, C 中进行填充。 我们依旧使用上篇中设计的例子,稍作修改: C 端增加个填充数据的函数fill_data,函数签名: Student* fill_data(Student *stu)。 话不多说,接上代码。我们创建了个名为 example_09 的 cargo 工程。 C 端内存对齐的同时,所有权的转移,也就是说执行后, p_stu 负责了由 box_new_stu 管理的内存。 结语 Rust 调用 C 时,使用 Box::into_raw 函数返回原始指针并转移所有权将该指针传给 C , Rust 端必须显式的使用 Box::from_raw 函数将原始指针转换回 Box

    38130

    类静态指针的申请和释放

    如果类有个静态员指针变量,进程中执行new或malloc操作分配了内存,进程退出并不需要调用new或malloc,因为系统会自动进行释放。 但这个静态员指针变量需要多少分配,又应该如果处理呢,最近项目代码中看到这样的例子,和大家分享下。 valgrind --tool=memcheck --leak-check=full  .a.out==3893== LEAK SUMMARY:==3893==    definitely lost: are not shown.==3893== To see them, rerun with: --show-reachable=yes    那应该如何解决呢,当然是应该delete,但是类的静态类的生命周期中是不能 但是可以把静态指针赋给另个局部指针,把局部指针释放掉,这样,即保存了静态指针,同时,资源也得释放。

    37020

    Linux性能分析工具与图形化方法

    程序正常退出后,会生gmon.out文件,解析这个文件,可以生个可视化的报告2.2 使用方法使用gprof,需要编译时,加入-pg选项另外只有程序正常退出后才会生gmon.out,kill 对于那些线程会run的服务,需要修改代码,让程序某个时间点停止。 但这三者间还是有定的差距:4.1 启动方式perf虽然可以挂接进程但需要root权限。普通权限下,perf和valgrind必须使用缀启动的方式来启动程序,这某种程度上会影响到程序的性能。 我们压测的过程中发现使用valgrind启动的时候,可以支持的线总人数比接运行程序要少很多。 4.2 程序侵入perf和valgrind都不需要修改Makefile或者程序,但gprof需要重新编译文件,并且对于线程run的服务,还需要修改代码让其自然退出,这定程序上侵入了程序。

    3.3K310

    谈谈如何利用 valgrind 排查内存错误

    导读Valgrind 最为开发者熟知和广泛使用的工具莫过于 Memcheck,它是检查 cc++ 程序内存错误的神器,报告结果非常精准。 本文主要分享作者使用该神器解决内存问题的过程中积累的些实战经验,希望帮助你快速定位问题甚至编码阶段就规避这些问题。Memcheck 可以检查哪些内存错误? Memcheck 可以检查 cc++ 程序中常见的以下问题:内存泄漏,包括进程运行过程中的泄漏和进程结束的泄漏。访问不应该访问的内存,即内存非法读写。变量未初始化,即使用未定义的值。 而且这些内存问题可能很难通过力去定位,尤其是当程序的代码量庞大、逻辑抽象且复杂的时候,更是会让人焦头烂额。此时,Memcheck 就是辅助我们解决这堆内存问题的神器。 因此,当我们处理 Invalid readwrite 这类内存读写错误时,个较为高效的解决思路是:首先要考虑的是非法读写的 block(内存块)是否读写已经因为程序的某些异常处理被释放了,然后仔细的审查代码来验证这种可能性

    1.1K30

    linux下的程序调试方法汇总

    )工具使用这个比较普遍,值得提倡;Valgrind (memwatch)内存排除工具,内存排除方面比较独到,是内存排错的法宝;GDB大名鼎鼎的程序调试工具,这个是个全能的工具,没有的,只有你不知道的 -> 命令行参数传递到当进程procmem -> 当进程持有的内存procstatus -> 当进程的状态3. 换句话说,它检测下面这些问题非常有用:内存泄露重释放访问越界使用未初始化的内存使用已经被释放的内存等。它接通过可执行文件运行。Valgrind也有些缺点,因为它增加了内存占用,会减慢你的程序。 我们现可以用valgrind来检测内存错误:valgrind –tool=memcheck –leak-check=yes test这是valgrind呈现错误的输出:? 如果没有传递参数默认操作是所有的断点step: 步执行程序continue: 继续执行程序,到执行毕退出 GDB:用quit命令还从GDB中退出。GDB还有更多的可用选项。

    85021

    IT项目研发过程中的利器

    (转载请指明出于breaksoftware的csdn博客)        进入这个系列,我们先看下大概十几年个段子:               “我”win98系统崩溃了,需要重装,但是没有系统盘 “传说”外,我们工作中,也是需要不同的利器,同时“站巨人的肩膀上”,才能让我们达到事倍功半的效果。         本系列就将探讨系列利器的使用方法。 然而这个系列要写哪些“利器”我还没决定好,所以这段文字只能算是言。未来,我将的各种工具相关文章,以目录条目的形式引入本文。 然而我们又必须修改它们,这个时候给代码“打补丁”的方案可以帮我们做到这点 《代码打补丁的利器——diff和patch》锁问题分析 《互斥量、读写锁长占时分析的利器——valgrind的DRD》 《锁问题分析的利器 未待续。

    26410

    高并发性能测试经验分享(下)

    valgrind的缺点 出现内存泄漏或者内存问题,大家第时间都会想到valgrindvalgrind款非常优秀的软件,不需要重新编译程序就能够接测试。 上面说了valgrind的功能和使用经验,但是valgrind也有个非常大的缺点,就是它会显著降低程序的性能,官方文档说使用memcheck工具时,降低10-50倍。 也就是说,如果nginx全握手性能是20000 qps,那么使用valgrind测试,性能就只有400 qps左右。 而valgrind不需要编程程序就能接运行。address sanitizer集了clang编译器中,GCC 4.8版本以上才支持。 我告诉自己: 1.调试BUG是次非常难得的学习机会,不要把它看是负担。不管是线上还是线下,能够主动地,高效地追查BUG特别是有难度的BUG,对自己来说次非常宝贵的学习机会。

    1.9K20

    相关产品

    • TencentOS Server

      TencentOS Server

      腾讯服务器操作系统(TencentOS Server,TS)是腾讯云推出的Linux操作系统,它旨在为云上运行的应用程序提供稳定、安全和高性能的执行环境。它可以运行在腾讯云CVM全规格实例上,包括黑石2.0服务器。

    相关资讯

    热门标签

    扫码关注云+社区

    领取腾讯云代金券