%id值异常 linux_linux mysql 主键id默认值 - CSDN
  • 近期阅读到Linux下显示CPU执行情况命令top的使用,网上搜索显示为 单位时间io占用cpu比例 , cpu等待输入输出, cpu等待io的时间。 起初看来,总觉得是io瓶颈或者是cpu负载率,仔细琢磨,总觉得哪里出了问题 跟进 ...

    起因

    近期阅读到Linux下显示CPU执行情况命令top的使用,网上搜索显示为

    单位时间io占用cpu比例
    cpu等待输入输出
    cpu等待io的时间

    起初看来,总觉得是io瓶颈或者是cpu负载率,仔细琢磨,总觉得哪里出了问题

    跟进

    因为IO所需要的CPU资源是非常少的,CPU对于IO只是起到调用分派。那为何wa值经常很高。
    继续跟进。

    • top不是显示cpu占用情况工具,而是linux系统资源的占用情况。

    • 搜索外文
      %wa表示 Show the percentage of time that the CPU or CPUs were idle during which the system had an outstanding disk I/O request.
      显示系统有未完成的磁盘I/O请求时CPU或CPU处于空闲状态的时间百分比。

      %id表示 Show the percentage of time that the CPU or CPUs were idle and the system did not have an outstanding disk I/O request.
      显示CPU或CPU空闲且系统没有未完成的磁盘I/O请求的时间百分比。

      两个值对比来看就一目了然了

    结论

    其实%wa 不单单是cpu使用情况或磁盘io使用情况,而是表明 cpu空闲着但是有许多等待磁盘的操作出现。
    如果cpu本身已经使用率很高。同时io操作很多。%wa值也不一定很高。此时也可能io操作出现问题。

    展开全文
  • linux服务器运行一段时间,free内存就快没有了,原来是Linux内核机制,不是内存泄露

    最近遇到一个疑问,不管是top,还是cat /proc/meminfo,  发现free内存基本快没了,难道我们的程序出问题了?排查半天没有事,

    后来百度到相关帖子,记录一下,这是Linux内核机制,


    Linux与Windows不同,会存在缓存内存,通常叫做Cache Memory。有些时候你会发现没有什么程序在运行,但是使用top或free命令看到可用内存会很少。
     
    什么是Cache Memory(缓存内存):
     
    当你读写文件的时候,Linux内核为了提高读写效率与速度,会将文件在内存中进行缓存,这部分内存就是Cache Memory(缓存内存)。即使你的程序运行结束后,Cache Memory也不会自动释放。这就会导致你在Linux系统中程序频繁读写文件后,你会发现可用物理内存会很少。
     
    其实这缓存内存(Cache Memory)在你需要使用内存的时候会自动释放,所以你不必担心没有内存可用。如果你希望手动去释放Cache Memory(缓存内存)的话也是有办法的。
     
    释放Cache Memory(缓存内存):
     
    用下面的命令可以释放Cache Memory:
     
    [rootmin@localhost~]#echo 3 > /proc/sys/vm/drop_caches
     
    Linux中如何释放cache内存
     
    因为LINUX的内核机制,一般情况下不需要特意去释放已经使用的cache。这些cache起来的内容可以增加文件以及的读写速度。
     
    先说下free命令怎么看内存
     
    [rootmin@localhost~]# free
     
    total used free shared buffers cached
     
    Mem: 515588 295452 220136 0 2060 64040
     
    -/+ buffers/cache: 229352 286236
     
    Swap: 682720 112 682608
     
    其中第一行用全局角度描述系统使用的内存状况:
     
    total——总物理内存 
     
    used——已使用内存,一般情况这个值会比较大,因为这个值包括了cache+应用程序使用的内存
     
    free——完全未被使用的内存
     
    shared——应用程序共享内存
     
    buffers——缓存,主要用于目录方面,inode值等(ls大目录可看到这个值增加)
     
    cached——缓存,用于已打开的文件
     
    注意:
     
    total=used+free
     
    used=buffers+cached (maybe add shared also)
     
    第二行描述应用程序的内存使用:
     
    前个值表示-buffers/cache——应用程序使用的内存大小,used减去缓存值
     
    后个值表示+buffers/cache——所有可供应用程序使用的内存大小,free加上缓存值
     
    注意
     
    -buffers/cache=used-buffers-cached
     
    +buffers/cache=free+buffers+cached
     
    第三行表示swap的使用: 
     
    used——已使用
     
    free——未使用
     
    cache释放:
     
    1.   To free pagecache:
     
    [rootmin@localhost~]#echo 1 > /proc/sys/vm/drop_caches
     
    2.   To free dentries and inodes:
     
    [rootmin@localhost~]#echo 2 > /proc/sys/vm/drop_caches
     
    3.   To free pagecache, dentries and inodes:
     
    [rootmin@localhost~]#echo 3 > /proc/sys/vm/drop_caches
     
    说明,释放前最好sync一下,防止丢数据

    展开全文
  • 1.CPU检查 top top 使用说明:  PID:进程的ID   USER:进程所有  PR:进程的优先级别,越小越优先被执 ...S表示休眠,R表示正在运行,Z表示僵死状态,N表示该进程优先为负 %CPU:进程占用C...

    1.CPU检查

    top

    top
    使用说明:
        PID:进程的ID  
        USER:进程所有
        PR:进程的优先级别,越小越优先被执
        NInice:
        VIRT:进程占用的虚拟内
        RES:进程占用的物理内
        SHR:进程使用的共享内
        S:进程的状态。S表示休眠,R表示正在运行,Z表示僵死状态,N表示该进程优先值为负    %CPU:进程占用CPU的使用    %MEM:进程使用的物理内存和总内存的百分
        TIME+:该进程启动后占用的总的CPU时间,即占用CPU使用时间的累加值
        COMMAND:进程启动命令名称1234567891011121314

     

    2.IO检查

    iotop

    iotop   查看所有进程的ioiotop -o  只输出io比较高的进程12

     

    3.网络检查

    netstat

    ··· 
    Netstat -ntlp 根据网络连接情况,最后面一栏是显示的路径\进程的位置 
    netstat -ano | more 查看所有端口 
    netstat -ano | grep 8088 查看8088端口 
    ···

    4.磁盘检查

    df

    df -hl1

     

    5.内存检查

    free

    free
    使用说明:
                    total       used       free     shared    buffers     cached
    Mem:       8059120     338288    7720832        516      13316     167576
    -/+ buffers/cache:     157396    7901724Swap:       835580          0     835580123456

    第二行(mem)的used/free与第三行(-/+ buffers/cache) used/free的区别: 
    这两个的区别在于使用的角度来看,第一行是从OS的角度来看,因为对于OS,buffers/cached 都是属于被使用,所以他的可用内存是7720832KB,已用内存是338288KB, 
    第三行所指的是从应用程序角度来看,对于应用程序来说,buffers/cached 是等于可用的,因为buffer/cached是为了提高文件读取的性能,当应用程序需在用到内存的时候,buffer/cached会很快地被回收。 
    所以从应用程序的角度来说,可用内存=系统free memory+buffers+cached。 
    如上例:可用内存=7720832+13316+167576

    ps

    ps aux

    vmstat

    vmstat -s

    展开全文
  • 内存异常经常导致程序出现莫名其妙的错误,往往很难查证,本文介绍在linux下的各种常见内存异常的查证工具和方法。1 访问空指针/未初始化指针/重复释放内存对于像访问空指针、未初始化指针(非法地址),重复释放...

    内存异常经常导致程序出现莫名其妙的错误,往往很难查证,本文介绍在linux下的各种常见内存异常的查证工具和方法。

    1 访问空指针/未初始化指针/重复释放内存

    对于像访问空指针、未初始化指针(非法地址),重复释放内存等内存异常,linux默认会抛异常。

    比如下面代码有空指针访问,编译运行后会coredump

    int main()
    {
        int *p=0;
        *p=6;
        return 0;
    }

    对于此类问题,我们只要在gcc编译程序时加入-g选项,同时在运行时能够生成coredump文件,利用gdb就可以定位到具体的问题代码行。

    1.1 开启coredump

    **ulimit -c  unlimited** //unlimited表示不限制coredump文件大小,也可指定一个具体值来限制文件最大长度。

    1.2 定制core文件名

    默认的coredump文件名为core,如果想自己定制core文件名,可以运行如下命令:

    **echo "./core-%e-%p-%t" > /proc/sys/kernel/core_pattern** 

    可以在core_pattern模板中使用变量还很多,见下面的列表:

    %% 单个%字符

    %p 所dump进程的进程ID

    %u 所dump进程的实际用户ID

    %g 所dump进程的实际组ID

    %s 导致本次core dump的信号

    %t core dump的时间 (由1970年1月1日计起的秒数)

    %h 主机名

    %e 程序文件名

    1.3 使用gdb定位代码行

    通过gdb即可定位出错代码行

    root@ubuntu:/home/zte/test# gcc null.cc -g
    root@ubuntu:/home/zte/test# ./a.out 
    Segmentation fault (core dumped)
    root@ubuntu:/home/zte/test# gdb a.out core
    .......
    Core was generated by `./null'.
    Program terminated with signal SIGSEGV, Segmentation fault.
    #0  0x00000000004004fd in main () at null.cc:4
    4    *p=6;

    2、函数栈溢出

    局部变量的写越界可能会破坏函数栈导致程序出现各种异常行为,但是OS默认不会在越界的第一现场coredump,因此导致问题查证非常困难。

    幸运的是我们可以通过gcc的编译选项-fstack-protector 和 -fstack-protector-all在函数栈被破坏的函数返回时抛异常,从而可以很方便地定位问题所在函数。

    代码示例

    int main()
    {
        int a=5;
        int *p=&a;
        p[3]=6;
        return 0;
    }


    上面代码会破坏函数栈,如果我们用gcc直接编译运行,不会抛异常。但是加了编译参数-fstack-protector 和 -fstack-protector-all后,再运行就会抛异常。下面是具体命令执行结果。

    root@ubuntu:/home/zte/test# gcc t.c
    root@ubuntu:/home/zte/test# ./a.out 
    root@ubuntu:/home/zte/test# gcc t.c -fstack-protector -fstack-protector-all -g
    root@ubuntu:/home/zte/test# ./a.out 
    *** stack smashing detected ***: ./a.out terminated
    Aborted (core dumped)
    ```
    可以进一步用gdb的bt命令定位出问题的函数。
    ```
    root@ubuntu:/home/zte/test# gdb a.out core
    。。。。。。。。
    Core was generated by `./a.out'.
    Program terminated with signal SIGABRT, Aborted.
    #0  0x00007f6bcfab5c37 in __GI_raise (sig=sig@entry=6) at ../nptl/sysdeps/unix/sysv/linux/raise.c:56
    56../nptl/sysdeps/unix/sysv/linux/raise.c: No such file or directory.
    (gdb) bt
    #0  0x00007f6bcfab5c37 in __GI_raise (sig=sig@entry=6) at ../nptl/sysdeps/unix/sysv/linux/raise.c:56
    #1  0x00007f6bcfab9028 in __GI_abort () at abort.c:89
    #2  0x00007f6bcfaf22a4 in __libc_message (do_abort=do_abort@entry=1, fmt=fmt@entry=0x7f6bcfc01d70 "*** %s ***: %s terminated\n")
        at ../sysdeps/posix/libc_fatal.c:175
    #3  0x00007f6bcfb8d83c in __GI___fortify_fail (msg=<optimized out>, msg@entry=0x7f6bcfc01d58 "stack smashing detected")
        at fortify_fail.c:38
    #4  0x00007f6bcfb8d7e0 in __stack_chk_fail () at stack_chk_fail.c:28
    #5  0x00000000004005aa in main () at t.c:7
    (gdb) q


    3 越界读写动态分配内存/读写已释放动态分配内存

    动态分配内存读写越界、读写已释放动态分配内存系统往往不会抛异常,我们可以使用electric-fence来使得读写越界内存/已释放内存后立刻抛异常,加速问题定位。

    3.1 安装Electric fence

    sudo apt-get install electric-fence

    3.2 使用Electric fence

    下面是越界写代码

    #include <stdlib.h>
    int main()
    {
        int *p = (int*)malloc(sizeof(int));
        p[1] = 6;
        return 0;
    }


    如果使用gcc直接编译运行,不会抛异常。

    我们可以加上参数 -lefence -g编译后运行,就会抛异常。通过gdb的bt打印即可定位到问题代码行。

    root@ubuntu:/home/zte/test# gcc malloc_read_free.cc -lefence -g
    root@ubuntu:/home/zte/test# ./a.out 
      Electric Fence 2.2 Copyright (C) 1987-1999 Bruce Perens <bruce@perens.com>
    Segmentation fault (core dumped)autogen.sh


    4 内存泄漏

    C/C++程序经常被内存泄漏问题困扰,本文介绍使用gperftools来快速定位内存泄漏问题。

    4.1 安装gperftools工具

    4.1.1 安装automake

    sudo apt-get install automake

    4.1.2 编译安装libunwind

    从https://github.com/libunwind/libunwind/releases下载最新版本的libunwind源码包

    解压到/usr/local/src目录

    cd 解压源码目录

    ./autogen.sh

    ./configure

    make -j6

    make install

    4.1.3 编译安装gperftools

    从https://github.com/gperftools/gperftools/releases下载最新版本的gperftools源码包

    解压到/usr/local/src目录

    cd 解压源码目录

    ./autogen.sh

    ./configure

    make -j6

    make install

    4.2 内存泄漏检测

    下面是一段简单的内存泄漏源码

    int main()
    {
        int *p = (int*)malloc(sizeof(int));
        return 0;
    }

    编译代码、运行工具检察内存泄漏,注意设置下

    root@ubuntu:/home/zte/# gcc leak.cc -g
    root@ubuntu:/home/zte/# env HEAPCHECK=normal LD_PRELOAD=/usr/local/lib/libtcmalloc.so ./a.out 
    WARNING: Perftools heap leak checker is active -- Performance may suffer
    Have memory regions w/o callers: might report false leaks
    Leak check _main_ detected leaks of 4 bytes in 1 objects
    The 1 largest leaks:
    *** WARNING: Cannot convert addresses to symbols in output below.
    *** Reason: Cannot run 'pprof' (is PPROF_PATH set correctly?)
    *** If you cannot fix this, try running pprof directly.
    Leak of 4 bytes in 1 objects allocated from:
    @ 40053f 
    @ 7f334da06f45 
    @ 400469 
    If the preceding stack traces are not enough to find the leaks, try running THIS shell command:
    pprof ./a.out "/tmp/a.out.8497._main_-end.heap" --inuse_objects --lines --heapcheck  --edgefraction=1e-10 --nodefraction=1e-10 --gv
    If you are still puzzled about why the leaks are there, try rerunning this program with HEAP_CHECK_TEST_POINTER_ALIGNMENT=1 and/or with HEAP_CHECK_MAX_POINTER_OFFSET=-1
    If the leak report occurs in a small fraction of runs, try running with TCMALLOC_MAX_FREE_QUEUE_SIZE of few hundred MB or with TCMALLOC_RECLAIM_MEMORY=false, it might help find leaks more repeatabl
    Exiting with error code (instead of crashing) because of whole-program memory leaks

    上面的关键的输入信息是:

    Leak of 4 bytes in 1 objects allocated from:

    @ 40053f   //内存分配的指令地址

    @ 7f334da06f45 

    @ 400469 

    由于工具没有直接输出问题代码行,我们通过反汇编来定位代码行:

    objdump -S a.out  //反汇编程序

    截取汇编代码如下:

    int main()
    {
      40052d:55                   push   %rbp
      40052e:48 89 e5             mov    %rsp,%rbp
      400531:48 83 ec 10          sub    $0x10,%rsp
        int *p = (int*)malloc(sizeof(int));
      400535:bf 04 00 00 00       mov    $0x4,%edi
      40053a:e8 f1 fe ff ff       callq  400430 <malloc@plt>
      40053f:48 89 45 f8          mov    %rax,-0x8(%rbp)
        return 0;
      400543:b8 00 00 00 00       mov    $0x0,%eax

    我们注意到40053f就是对应代码行int *p = (int*)malloc(sizeof(int));

    至此,内存泄漏的元凶被揪出来了,呵呵。


    https://cloud.tencent.com/info/e1ee255a3cd7993a301ffe75bbcfe031.html

    展开全文
  • 这节,我们继续上,中(以前的日志有)篇目进行分析,结合一个真实的驱动案例来描述linux内核中驱动的中断机制,首先我们先了解一下linux内核中提供的中断接口。  这个接口我们需要包含一个头文件:#include  在...
  • linux操作系统下c语言编程入门 整理编写:007xiong 原文:Hoyt等 (一)目录介绍 1)Linux程序设计入门--基础知识 2)Linux程序设计入门--进程介绍 3)Linux程序设计入门--文件操作 4)Linux程序设计入门--时间概念 5)...
  • linux性能调试----cpu篇

    2016-01-26 22:51:40
    linux性能调试----cpu篇 1、mpstat -P ALL 2,观察cpu是否有异常,下列哪一项异常:  %usr 用户态的cpu时间(%)(不包含nice为负的进程)----pstack %nice nice为负的进程的cpu时间(%) %sys 内核态的...
  • 在Web程序中我们通过日志系统(比如log4j)向外部文件(比如log.txt)写入了程序运行时的某些日志(一般都会给日志行头加上tag),日志输出了程序中约定的一些变量(可能是某个订单号、某条服务码、请求ID值等标识)...
  • Linux中errno使用

    2011-09-01 16:46:00
    linux中的C api函数发生异常时,一般会将errno变量(需include errno.h)赋一个整数,不同的表示不同的含义,可以通过查看该推测出错的原因,在实际编程中用这一招解决了不少原本看来莫名其妙的问题。但是errno是...
  • Linux面试题 一、填空题 1. 在Linux 系统 中,以文件方式访问设备 。 2. Linux 内核引导时,从文件/etc/fstab中读取要加载的文件系统 。 3. Linux 文件系统中每个文件用indoe节点来标识。 4. 全部磁盘块由...
  • 文章目录Linux 概述什么是LinuxUnix和Linux有什么区别?什么是 Linux 内核?Linux的基本组件是什么?Linux 的体系结构BASH和DOS之间的基本区别是什么?Linux 开机启动过程?Linux系统缺省的运行级别?Linux 使用的...
  • ARM平台Linux内核空指针异常处理流程 平台:Linux 3.10.40 + ARM V7 一 从异常向量入口到__do_kernel_fault 访问空指针在ARM平台上属于data abort异常,对应异常向量中的vector_dabt。 文件:arch/arm/...
  • linux内核中断、异常

    2011-12-25 14:59:36
    中断: 可屏蔽中断:所有有I/O设备...处理器产生的(Fault,Trap,Abort)异常 programmed exceptions(软中断):由程序员通过INT或INT3指令触发,通常当做trap处理,用处:实现系统调用。 中断描述符表(IDT):2
  • linux中errno使用

    2017-08-23 15:39:10
    linux中的C api函数发生异常时,一般会将errno变量(需include errno.h)赋一个整数,不同的表示不同的含义,可以通过查看该推测出错的原因,在实际编程中用这一招解决了不少原本看来莫名其妙的问题。但是errno是...
  • Linux多线程概念 线程的概念 线程是计算机科学中的一个术语,是指运行中的程序的调度单位。一个线程指的是进程中一个单一顺序的控制流,也称为轻量进程。它是系统独立调度和分配的基本单位。同一进程中的多个线程...
  • Linux中,有时候会遇到文件名乱码或者存在某些特殊中文的文件,这时候难易...对于linux中的任何一个文件都必然有其唯一的inode,这时候就可以通过inode来删除异常文件名的文件。利用find命令来删除find ./* -inum
  • CPU负载查看方法: 使用vmstat查看系统维度的CPU负载 使用top查看进程维度的CPU负载 使用 vmstat 查看系统纬度的 CPU 负载: ...可以通过 vmstat 从系统维度查看 CPU 资源的使用情况。...格式:vmstat -n 1# -n 1 ...
  • 日期 内核版本 架构 作者 GitHub CSDN 2016-05-12 Linux-4.6 X86 & arm gatieme LinuxDeviceDrivers Linux进程管理与调度 Linux进程的退出linux下进程退出的方式正常...异常退出 调用abort 由信号终止 _exit
  • 异常则是由程序的错误产生,或者由内核必须处理的异常条件产生。第一种情况下,内核通过发送一个信号来处理异常;第二种情况下,内核执行恢复异常需要的所有步骤,或对内核服务的一个请求。 中断和异常...
1 2 3 4 5 ... 20
收藏数 67,903
精华内容 27,161
关键字:

%id值异常 linux