linux pid 值很大_linux进程pid很大要怎么干掉 - CSDN
  • Linux最大线程数限制

    2019-05-21 15:24:30
    研发环境上的Linux项目启动报错:Caused by: java.lang.OutOfMemoryError: unable to create new native thread 开始以为是内存不足导致无法创建线程,把jvm的-Xms,-Xmx的2个参数都加大一倍:-Xms2048m -Xmx2048m。...

    研发环境上的Linux项目启动报错:Caused by: java.lang.OutOfMemoryError: unable to create new native thread

    开始以为是内存不足导致无法创建线程,把jvm的-Xms,-Xmx的2个参数都加大一倍:-Xms2048m -Xmx2048m。把-Xss参数调小,还是启动失败。应该是系统方面的限制了,这台机器上搞了100个过tomcat进程,还有不少其他软件,东西比较多且杂。确认过机器的内存还是足够的,先排查系统参数,之后再清理垃圾资源了。
    系统可生成最大线程数

    cat /proc/sys/kernel/threads-max
    这个值很大,tomcat进程的全部线程数肯定没有超过它,如果实际线程数比它大可改大(实际可能是代码问题,开启了太多线程)。
    进程最大线程数

    ps -eLf | grep 项目名 | wc -l 查看单个项目线程数,启动失败的这个项目线程数一般在600左右
    cat /proc/sys/vm/max_map_count
    65530
    这个值没有问题,jvm的启动参数为-Dconfig.server.maxThreads=3000,也没有问题
    用户最大进程数

    ulimit -a
    其中max user processes就是表示用户的最大进程数,我的这个值很大,进程数也没有超过它。如果超过的话,可以修改最大进程数的配置
    vi /etc/security/limits.d/90-nproc.conf

    • soft nproc 1024
      root soft nproc unlimited
      上面可以看除了root用户外的所有用户均限制为1024,因此通过可以注释此行或者将值改大,保存后修改立刻生效
      #* soft nproc 1024
      root soft nproc unlimited
      整个系统已用的线程或进程数

    cat /proc/sys/kernel/pid_max
    该值是32678(32位Linux系统可创建的最大pid数是32678),查询当前整个系统已用的线程或进程数:pstree -p | wc -l,结果比32678稍小,问题就在这了

    vim /proc/sys/kernel/pid_max,改为65535保存退出的时候报错如下
    /proc/sys/kernel/pid_max E667 Fsync failed
    改成下面方式即可:
    echo “65535” > /proc/sys/kernel/pid_max

    展开全文
  • Linux服务器性能评估与优化(一)--CPU

    万次阅读 多人点赞 2020-06-14 05:39:07
    之前文章《Linux服务器性能评估与优化(一)》太长,阅读不方便,因此拆分成系列博文: 《Linux服务器性能评估与优化(一)--CPU》 《Linux服务器性能评估与优化(二)--内存》 《Linux服务器性能评估与优化(三)--磁盘i...

    之前文章《Linux服务器性能评估与优化(一)》太长,阅读不方便,因此拆分成系列博文:

    Linux服务器性能评估与优化(一)--CPU

    Linux服务器性能评估与优化(二)--内存

    Linux服务器性能评估与优化(三)--磁盘i/o

    Linux服务器性能评估与优化(四)--网络

    Linux服务器性能评估与优化(五)--内核参数

     

     

    1、前言简介


    1.1、影响Linux服务器性能的因素 

      1. 操作系统级

            性能调优是找出系统瓶颈并消除这些瓶颈的过程。 很多系统管理员认为性能调优仅仅是调整一下内核的参数即可解决问题, 事实上情况并不是这样。 性能调优是实现操作系统的各个子系统之间的平衡性,这些子系统包括:

    Ø       CPU

    Ø       内存

    Ø       磁盘I/O带宽

    Ø       网络I/O带宽

    子系统之间相互依存,任何一个子系统的负载过度都能导致其他子系统出现问题,例如:
    * 大量的 page-in IO 请求可能导致内存队列被塞满
    * 网卡的巨量吞吐可能导致 CPU 资源耗尽
    * 系统尝试保持释放内存队列时可能耗尽 CPU 资源
    * 来自内存的大量磁盘写入请求可能导致 CPU 资源和 IO 通道耗尽

    性能调优的前提是找出系统瓶颈之所在, 尽管问题看似由某个子系统所导致, 然而这很可能是另外一个子系统的过载所引起的。

    2.    程序应用级

     为了明白从何处开始着手调整性能瓶颈, 弄清被分析系统的性能表现是首要任务。 任何系统的应用常可分为以下两类:
    1) IO 限制型——一个 IO 限制型的应用需要大量的内存和基础存储设备占用。 因其需要大量的数据读写请求,此类应用对 CPU 和网络需求不高(除非存储系统在网络上) 。
           IO 限制型应用使用 CPU 资源来进行 IO 操作且常进入睡眠状态。 数据库应用常被认为属于此类。


    2)CPU 限制型——一个 CPU 限制型应用需要大量的 CPU 资源,来进行批量的处理或大量的计算。大容量 web 服务,mail 服务,以及任何类型的渲染服务都被归到此类。

    1.2、系统性能评估标准

            判断一个系统是否有性能问题的唯一途径是弄清楚对系统的期望是神马, 需求的性能是神马, 应该得到的数据是神马?而为了建立这些信息的唯一途径是为系统建立一个基准。 在性能可接受的状态下必须为系统建立统计信息,这样就可以在性能不可接受时进行对比。

    影响性能因素

    评判标准

    糟糕

    CPU

    user% + sys%< 70%

    user% + sys%= 85%

    user% + sys% >=90%

    内存

    Swap In(si)=0

    Swap Out(so)=0

    Per CPU with 10 page/s

    More Swap In & Swap Out

    磁盘

    iowait % < 20%

    iowait % =35%

    iowait % >= 50%

     

    其中:

           %user:表示CPU处在用户模式下的时间百分比。

           %sys:表示CPU处在系统模式下的时间百分比。

           %iowait:表示CPU等待输入输出完成时间的百分比。

           swap in:即si,表示虚拟内存的页导入,即从SWAP DISK交换到RAM

           swap out:即so,表示虚拟内存的页导出,即从RAM交换到SWAP DISK

     

    1.3、系统性能分析工具

    1.常用系统命令 

    Vmstatsariostatnetstatfreepstop

     

    2.常用组合方式 

    •  vmstatsariostat检测是否是CPU瓶颈

    •  freevmstat检测是否是内存瓶颈

    iostat检测是否是磁盘I/O瓶颈

    •  netstat检测是否是网络带宽瓶颈(netstat -nat | awk 'FNR>2{print $NF}' | sort | uniq -c) 

                 netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'

     

    Linux性能评估与优化:cpu,内存,IO, 网络

    系统工具图:

     

     

    2、负载:整体性能评估


    2.1系统整体性能评估(uptime命令/top)

    # uptime

    16:38:00 up 118 days,  3:01,  5 users,  load average: 1.22, 1.02, 0.91

    这里需要注意的是:load average这个输出值,这三个值的大小一般不能大于系统CPU的个数,例如,本输出中系统有8个CPU,如果load average的三个值长期大于8时,说明CPU很繁忙,负载很高,可能会影响系统性能,但是偶尔大于8时,倒不用担心,一般不会影响系统性能。相反,如果load average的输出值小于CPU的个数,则表示CPU还有空闲的时间片,比如本例中的输出,CPU是非常空闲的。

     

    Load:top

    系统负载指运行队列的平均长度,也就是等待CPU的平均进程数。Load越高说明系统响应越慢,如果load是0,代表进程不需要等待,立刻就能获得cpu运行。可以通过查询文件/proc/loadavg获取系统在前一分钟、前五分钟和前十五分钟的平均负载以及当前运行的进程、系统的进程数和上一次调度运行的进程。

    justin@junjun:/proc$ cat/proc/loadavg

    0.71 0.70 0.63 1/403 5111

    在linux系统中,也可直接通过命令行 “w”或者“uptime”查看,如下:

    16:10:22 up 1 day, 4:18,  3 users,  load average: 0.34, 0.50, 0.52

    USER     TTY      FROM              LOGIN@  IDLE   JCPU   PCPU WHAT

    justin   tty7     :0               Tue11   28:19m 10:15   0.22s gnome-session

    justin   pts/0    :0.0             Tue11   28:17m 2:22   0.00s /bin/bash./jettyctl.sh

    justin   pts/1    :0.0             16:08    0.00s 0.17s  0.00s w

    cpu usage:

    系统的CPU使用率。

    可以用“top”命令动态的显示当前系统进程用户的使用情况。

    前五行是系统整体的统计信息。

    第一行是任务队列信息,同 uptime 命令的执行结果。其内容如下:当前时间;系统运行时间,格式为时:分;当前登录用户数;系统负载,即任务队列的平均长度。

    第二、三行为进程和CPU的信息。当有多个CPU时,这些内容可能会超过两行。

    内容如下:Tasks: 175 total进程总数;1 running正在运行的进程数;174 sleeping睡眠的进程数;0 stopped停止的进程数;0 zombie僵尸进程数

    Cpu(s):22.0% us用户空间占用CPU百分比

    20.7%sy内核空间占用CPU百分比

    1.1%ni用户进程空间内改变过优先级的进程占用CPU百分比

    52.7%id空闲CPU百分比

    3.3%wa等待输入输出的CPU时间百分比

    0.0%hi

    0.2%si swap in,表示虚拟内存的页导入,即从SWAPDISK交换到RAM

    0.0%st swap out,表示虚拟内存的页导出,即从RAM交换到SWAPDISK。

     

    PR:操作系统给进程的安排的优先级。这个值标示进程调度器分配给进程的时间片长度。单位是时钟个数。如果一个Linux系统的时间片是10ms,那么PID是2718的进程在执行了200ms后,才会进行进程切换。 

    RES:进程占用的物理内存大小             

    VIRT:物理内存+虚拟内存。                                                                        

    吞吐率:

    服务器单位时间内处理的请求数,一般用来描述并发能力,当然谈吞吐率的前提是并发用户数。不同的并发用户数下,吞吐率自然大不相同。单位是“请求数/秒”。吞吐量分为网络吞吐量和事务吞吐量,当作为事务吞吐量时,采用TPS来衡量。目前线上环境Apache没有mod_status模块,不能很方便的查询。

    TPS:

    服务器每秒处理的事务数。PV在性能测试中的表现形式是以TPS来体现的,两者有一个转换公式,如下:

    TPS平均值 =((PV*80%)/(24*60*60*40%))/服务器数量 =  pv/s

    TPS峰值 =(((PV*80%)/(24*60*60*40%))*1.6) /服务器数量=  pv/s ,这个和我们经常说的“2-8原则”贴近。

    一般的,评价系统性能均以每秒钟完成的技术交易的数量来衡量。系统整体处理能力取决于处理能力最低模块的TPS 。应用系统的处理能力一般要求在10-100左右。

    介绍在top命令执行过程中可以使用的一些交互命令。从使用角度来看,熟练的掌握这些命令比掌握选项还重要一些。这些命令都是单字母的,如果在命令行选项中使用了s选项,则可能其中一些命令会被屏蔽掉。
    <空格>; 立即刷新显示。
    Ctrl+L 擦除并且重写屏幕。
    h或者? 显示帮助画面,给出一些简短的命令总结说明。
    k 终止一个进程。系统将提示用户输入需要终止的进程PID,以及需要发送给该进程什幺样的信号。一般的终止进程可以使用15信号;如果不能正常结束那就使用信号9强制结束该进程。默认值是信号15。在安全模式中此命令被屏蔽。
    i 忽略闲置和僵死进程。这是一个开关式命令。
    q 退出程序。
    r 重新安排一个进程的优先级别。系统提示用户输入需要改变的进程PID以及需要设置的进程优先级值。输入一个正值将使优先级降低,反之则可以使该进程拥有更高的优先权。默认值是10。
    S 切换到累计模式。
    s 改变两次刷新之间的延迟时间。系统将提示用户输入新的时间,单位为s。如果有小数,就换算成ms。输入0值则系统将不断刷新,默认值是5 s。需要注意的是如果设置太小的时间,很可能会引起不断刷新,从而根本来不及看清显示的情况,而且系统负载也会大大增加。
    f或者F 从当前显示中添加或者删除项目。
    o或者O 改变显示项目的顺序。
    l 切换显示平均负载和启动时间信息。
    m 切换显示内存信息。
    t 切换显示进程和CPU状态信息。
    c 切换显示命令名称和完整命令行。
    M 根据驻留内存大小进行排序:查看最耗内存的进程
    P 根据CPU使用百分比大小进行排序:查看最耗cpu的进程
    T 根据时间/累计时间进行排序。

    W 将当前设置写入~/.toprc文件中。这是写top配置文件的推荐方法。

     

     

    3、CPU性能评估


    3.1、CPU介绍

           CPU 利用率很大部分取决于试图访问它的资源, 内核拥有一个管理两种资源的调度器:线程(单或多)和中断。调度器给予不同资源以不同的优先级,以下由优先级从高到低:

    1) 中断——设备通知内核它们处理完成。例如网卡发送一个数据包或硬盘驱动器提供一次 IO 请求
    2) 内核(系统)进程——所有的内核进程都在此级别的优先级进行处理
    3)用户进程——通常被称为“用户空间” ,所有应用软件运行在用户空间,拥有最低的优先级

    为了弄明白内核是如何管理不同的资源的,几个关键概念需要提及一下: context  switches,run queues,utilization。

    Context Switches(上下文切换):进程调度

           CPU切换到另一个进程需要保存当前进程的状态并恢复另一个进程的状态:当前运行任务转为就绪(或者挂起、中断)状态,另一个被选定的就绪任务成为当前任务。进程调度包括保存当前任务的运行环境,恢复将要运行任务的运行环境。

            大多数处理器在同一时间只能处理一个进程或线程,多线程处理器可同时处理 n 个线程。然而,linux 内核把多核处理器的各个核心当做独立核心。例如,内核把一个双核的处理当做两个独立处理器。

             一个标准的内核可同时处理 50 到 50000 个进程, 在只有一颗 CPU 的情况下, 内核必须调度和平衡这些进程和线程。 每个线程在处理器上都拥有一个时间分配单元, 当一个线程超过自己的时间单元或被更高优先级的程序抢占时, 此线程及被传回队列而此时更高优先级的程序将在处理器上执行。这种线程间的切换操作即是上下文切换。

           在linux内核中,每一个进程都存在一个名为“进程描述符”的管理表。该进程描述符会调整为按照优先级降序排序,已按合理的顺序运行进程(任务)。

    进程状态:

           运行态(running) 只要cpu空闲,任何时候都可以运行
           可中断睡眠(interruptible) 为恢复时间无法预测的长时间等待状态。如,来自于键盘设备的输入。
           不可中断睡眠:(uninterruptible) 主要为短时间时的等待状态。被IO阻塞的进程,例如等待磁盘IO,网络IO,或者一个系统调用等待内核空间的返回。
           就绪态(runnable) 响应暂停信号而运行的中断状态。
           僵死态(zombie) 进程都是由父进程创建,并销毁;在父进程没有销毁其子进程,被销毁的时候,其子进程由于没有父进程被销毁,就会转变为僵死态。

    运行队列:负载
          每个 CPU 维持着一个线程的运行队列, 理论上, 调度器应该是不断地运行和执行线程。线程要么处于睡眠状态,要么处于可运行状态。假如 CPU 子系统处于高负载状态,那么内核调度器罢工是有可能的, 其结果将导致可运行状态的进程开始阻塞运行队列。 运行队列越大,执行进程所花费的时间也越长。
    一个很流行的术语叫“load(负载) ”经常被用来描述运行队列的状态,系统负载是由正在执行的进程和 CPU 运行队列中的进程的结合,如果有 2 个线程正在一个双核系统中执行且4 个正在运行队列中, 那么负载数即是 6, 像 top 等工具可查看过去 1,5,15 分钟的负载均值。

          load average 值包括:进程处于状态是R(运行态 running)和不可中断状态 D(D状态 uninterruptible),也就是下面这两种情况的进程才会表现为负载的值。
          1)即便需要立即使用CPU,也还需等待其他进程用完CPU
          2)即便需要继续处理,也必须等待磁盘输入输出完成才能进行

       一般来说Load简单的计算就是2* CPU个数减去1-2左右(这个只是网上看来的,未必是一个标准)。

    CPU 利用率
    CPU 利用率被定义为 CPU 使用的百分比, CPU 如何被利用是衡量一个系统的重要标准。多数性能监测工具把 CPU 利用分为以下几个类型:
    * 用户时间——CPU 花在执行用户空间进程的时间百分比
    * 系统时间——CPU 花在执行内核进程和中断的时间百分比
    * IO 等待——CPU 花在等待 IO 请求完成的时间百分比
    * IDLE——CPU 的空闲时间百分比

    CPU的使用率= (%us + %sy + %ni)

    理解 CPU 的性能状态即是理解中断,运行队列和上下文切换的状态。之前有提到过性能与基准信息有密切关系,但是有些常规的性能预期:
    * 运行队列——每个处理器上的运行队列不应该有超过 1-3 个排队的线程。 例如, 一个双核系统不应该有超过 6 个进行在运行队列里。
    * CPU 利用率——假如一个 CPU 满状态负荷,那么以下的平衡关系需要达到:
        65%--70%的用户时间
        30%--35%的系统时间
        0%--5%的空闲时间
    * 上下文切换——上下文切换的数量与 CPU 的利用率有直接关系。如果 CPU 处于高负荷状态下那么大量的上下文切换是正常的

     

    3.2、利用vmstat命令监控系统CPU

       vmstat 工具的低开销使得它可以在一个高负载的系统上持续运行,它有两种工作模式:均值模式和采样模式。采样模式如下:

       该命令可以显示关于系统各种资源之间相关性能的简要信息,这里我们主要用它来看CPU一个负载情况。

       下面是vmstat命令在某个系统的输出结果:

    [root@node1 ~]# vmstat 2 3

    procs -----------memory----------  ---swap--  -----io---- --system--  -----cpu------

     r  b   swpd   free      buff  cache   si   so    bi    bo       in     cs     us sy  id   wa st

     0  0    0    162240   8304  67032   0    0    13    21   1007   23     0  1   98   0   0

     0  0    0    162240   8304  67032   0    0     1     0     1010   20     0  1   100 0   0

     0  0    0    162240   8304  67032   0    0     1     1     1009   18     0  1    99  0   0

    Procs

         r:运行和等待cpu时间片的进程数,这个值如果长期大于系统CPU的个数,说明CPU不足,需要增加CPU。

         b:在等待资源的进程数,比如正在等待I/O、或者内存交换等。其实就是阻塞的进程。

    Memory

         swpd: 虚拟内存使用情况,单位:KB

         free: 空闲的内存,单位KB

         buff: 被用来做为缓存的内存数,一般对块设备的读写才需要缓冲,单位:KB

         cache:表示page cached的内存数量,一般作为文件系统cached,频繁访问的文件都会被cached,如果cache值较大,说明cached的文件数较多,如果此时IO中bi比较小,说明文件系统效率比较好。

    Swap:如果大于0,表示你的机器物理内存不足了,如果不是程序内存泄露的原因,那么你该升级内存了或者把耗内存的任务迁移到其他机器。

         si: 从磁盘交换到内存的交换页数量,单位:KB/秒。如果这个值大于0,表示物理内存不够用或者内存泄露了,要查找耗内存进程解决掉。

         so: 从内存交换到磁盘的交换页数量,单位:KB/秒。如果这个值大于0,同上。

    I/O

         bi: 发送到块设备的块数,单位:块/秒

         bo: 从块设备接收到的块数,单位:块/秒。例如我们读取文件,bo就要大于0。bi和bo一般都要接近0,不然就是IO过于频繁,需要调整。

    符设备和块设备的区别 :

         设备文件分为Block Device Driver和Character Device Drive两类。Character Device Drive又被称为字符设备或裸设备raw devices; Block Device Driver通常成为块设备。而Block Device Driver是以固定大小长度来传送转移资料 ;Character Device Driver是以不定长度的字元传送资料 。且所连接的Devices也有所不同,Block Device大致是可以随机存取(Random Access)资料的设备,如硬碟机或光碟机;而Character Device刚好相反,依循先後顺序存取资料的设备,如印表机 、终端机等皆是。

           /dev/dsk对应的为块设备,文件系统的操作用到它,如mount。/dev/rdsk对应的为字符设备(裸设备,rdsk的r即为 raw),fsck newfs等会涉及到。一般我们的操作系统和各种软件都是以块方式读写硬盘,这里的块是逻辑块,创建文件系统时可以选择,windows里叫簇。可看 newfs or mkfs的manual。oracle是比较常见的字符方式读写硬盘。

           字符设备还是块设备的定义属于操作系统的设备访问层,与实际物理设备的特性无必然联系。设备访问层下面是驱动程序,所以只要驱动程序提供的方式,都可以。 也就是说驱动程序支持stream方式,那么就可以用这种方式访问,驱动程序如果还支持block方式,那么你想用哪种方式访问都可以,典型的比如硬盘式 的裸设备,两种都支持块设备(block device):是一种具有一定结构的随机存取设备,对这种设备的读写是按块进行的,他使用缓冲区来存放暂时的数据,待条件成熟后,从缓存一次性写入设备 或从设备中一次性读出放入到缓冲区,如磁盘和文件系统等字符设备(Character device):这是一个顺序的数据流设备,对这种设备的读写是按字符进行的,而且这些字符是连续地形成一个数据流。他不具备缓冲区,所以对这种设备的读 写是实时的,如终端、磁带机等。

          系统中能够随机(不需要按顺序)访问固定大小数据片(chunks)的设备被称作块设备,这些数据片就称作块。最常见的块设备是硬盘,除此以外,还有软盘驱 动器、CD-ROM驱动器和闪存等等许多其他块设备。注意,它们都是以安装文件系统的方式使用的——这也是块设备一般的访问方式。

           另一种基本的设备类型是字符设备。字符设备按照字符流的方式被有序访问,像串口和键盘就都属于字符设备。如果一个硬件设备是以字符流的方式被访问的话,那就应该将它归于字符设备;反过来,如果一个设备是随机(无序的)访问的,那么它就属于块设备。

           这两种类型的设备的根本区别在于它们是否可以被随机访问——换句话说就是,能否在访问设备时随意地从一个位置跳转到另一个位置。举个例子,键盘这种设备提供 的就是一个数据流,当你敲入“fox”这个字符串时,键盘驱动程序会按照和输入完全相同的顺序返回这个由三个字符组成的数据流。如果让键盘驱动程序打乱顺 序来读字符串,或读取其他字符,都是没有意义的。所以键盘就是一种典型的字符设备,它提供的就是用户从键盘输入的字符流。对键盘进行读操作会得到一个字符 流,首先是“f”,然后是“o”,最后是“x”,最终是文件的结束(EOF)。当没人敲键盘时,字符流就是空的。硬盘设备的情况就不大一样了。硬盘设备的 驱动可能要求读取磁盘上任意块的内容,然后又转去读取别的块的内容,而被读取的块在磁盘上位置不一定要连续,所以说硬盘可以被随机访问,而不是以流的方式 被访问,显然它是一个块设备。

           内核管理块设备要比管理字符设备细致得多,需要考虑的问题和完成的工作相比字符设备来说要复杂许多。这是因为字符设备仅仅需要控制一个位置—当前位置—而 块设备访问的位置必须能够在介质的不同区间前后移动。所以事实上内核不必提供一个专门的子系统来管理字符设备,但是对块设备的管理却必须要有一个专门的提 供服务的子系统。不仅仅是因为块设备的复杂性远远高于字符设备,更重要的原因是块设备对执行性能的要求很高;对硬盘每多一分利用都会对整个系统的性能带来 提升,其效果要远远比键盘吞吐速度成倍的提高大得多。另外,我们将会看到,块设备的复杂性会为这种优化留下很大的施展空间。

    linux驱动程序中字符设备和块设备的三点区别

    1.字符设备只能以字节为最小单位访问,而块设备以块为单位访问,例如512字节,1024字节等

    2.块设备可以随机访问,但是字符设备不可以

    3.字符和块没有访问量大小的限制,块也可以以字节为单位来访问

    System

          in: 每秒的中断数,包括时钟中断。

          cs(context switch): 每秒的环境(上下文)切换次数。例如我们调用系统函数,就要进行上下文切换,线程的切换,也要进程上下文切换,这个值要越小越好,太大了,要考虑调低线程或者进程的数目,例如在apache和nginx这种web服务器中,我们一般做性能测试时会进行几千并发甚至几万并发的测试,选择web服务器的进程可以由进程或者线程的峰值一直下调,压测,直到cs到一个比较小的值,这个进程和线程数就是比较合适的值了。系统调用也是,每次调用系统函数,我们的代码就会进入内核空间,导致上下文切换,这个是很耗资源,也要尽量避免频繁调用系统函数。上下文切换次数过多表示你的CPU大部分浪费在上下文切换,导致CPU干正经事的时间少了,CPU没有充分利用,是不可取的。

    cpu

        us:用户进程消耗的CPU 时间百分比。us的值比较高时,说明用户进程消耗的cpu时间多,但是如果长期大于50%,就需要考虑优化程序或算法。

         sy:内核进程消耗的CPU时间百分比。Sy的值较高时,说明内核消耗的CPU资源很多,即系统调用(system call)时间长,例如是IO操作频繁。

    根据经验,us+sy的参考值为70%,如果us+sy大于 70%说明可能存在CPU资源不足。

      wt:等待IO CPU时间

    注意:

                1)如果 r (run queue 运行队列中的进程数)经常大于 4 ,且id经常少于40,表示cpu的负荷很重。

                2)如果si,so 长期不等于0,表示内存不足。

                3)如果disk 经常不等于0, 且在 b中的队列大于3, 表示 io性能不好。

               4)其拥有很高的中断数 (in) 和很低的上下文切换数, 这说明可能有单个进程在进行大量的硬件资源请求。
                5)运行队列数刚好达到可接受的上限值,且出现超过上限值的情况。

     

    什么场景会造成负载很高但CPU低

    负载总结为一句话就是:需要运行处理但又必须等待队列前的进程处理完成的进程个数。具体来说,也就是如下两种情况:
    1)等待被授权予CPU运行权限的进程
    2)等待磁盘I/O完成的进程
    ps -eLf可以查看系统的线程。

    cpu低而负载高也就是说等待磁盘I/O完成的进程过多,就会导致队列长度过大,这样就体现到负载过大了,但实际是此时cpu被分配去执行别的任务或空闲,通过以下命令查看:

    1、IOWAIT:通过top命令查看CPU等待IO时间,即%wa;

    2、磁盘IO: 通过iostat -d -x -m 1 10查看磁盘IO情况;

    3、网络IO:通过sar -n DEV 1 10查看网络IO情况;

    通过如下命令查找占用IO的程:

    ps -e -L h o state,cmd  | awk '{if($1=="R"||$1=="D"){print $0}}' | sort | uniq -c | sort -k 1nr

    具体场景有如下几种。

    场景1:内存耗尽,如果没有开启swap内存,也将会导致负载特别高,cpu使用很低。


    场景2:磁盘读写请求过多就会导致大量I/O等待
    cpu的工作效率要高于磁盘,而进程在cpu上面运行需要访问磁盘文件,这个时候cpu会向内核发起调用文件的请求,让内核去磁盘取文件,这个时候会切换到其他进程或者空闲,这个任务就会转换为不可中断睡眠状态。当这种读写请求过多就会导致不可中断睡眠状态的进程过多,从而导致负载高,cpu低的情况。

    场景3:MySQL中存在没有索引的语句或存在死锁等情况
    我们都知道MySQL的数据是存储在硬盘中,如果需要进行sql查询,需要先把数据从磁盘加载到内存中。当在数据特别大的时候,如果执行的sql语句没有索引,就会造成扫描表的行数过大导致I/O阻塞,或者是语句中存在死锁,也会造成I/O阻塞,从而导致不可中断睡眠进程过多,导致负载过大。
    具体解决方法可以在MySQL中运行show full processlist命令查看线程等待情况,把其中的语句拿出来进行优化。

    场景4:外接硬盘故障,常见有挂了NFS,但是NFS server故障
    比如我们的系统挂载了外接硬盘如NFS共享存储,经常会有大量的读写请求去访问NFS存储的文件,如果这个时候NFS Server故障,那么就会导致进程读写请求一直获取不到资源,从而进程一直是不可中断状态,造成负载很高。
    场景5:访问第三方api接口
    如果我们访问第三方http api,例如接口的响应时间很慢,readTimeout=2000ms,在高并发的情况下,很多线程都被中断等待api的网络IO。导致cpu使用率很低,但是load很高。

    场景五:系统出现大量的僵死进程:

    解决办法:
    出现此种情况时,可能是由于僵死进程导致的。可以通过指令 ps -axjf  查看是否存在 D 状态进程。
    D 状态是指不可中断的睡眠状态。该状态的进程无法被 kill,也无法自行退出。只能通过恢复其依赖的资源或者重启系统来解决。

    什么场景会造成CPU跑满:

    CPU 的跑满或跑高

    1)普通进程占用很高,可以直接kill掉

    2)kswapd0 进程导致的内存不足等问题,您需要对系统进行规格的升级或程序的优化。(内存优化章节有说明)

    kswapd0 进程占用导致 CPU 较高

    操作系统都用分页机制来管理物理内存,系统会把一部分硬盘空间虚拟成内存使用。由于内存的速度要比磁盘快得多,所以系统要按照某种换页机制将不需要的页面换到磁盘中,将需要的页面调到内存中。

    kswapd0 是虚拟内存管理中负责换页的进程,当服务器内存不足的时候 kswapd0 会执行换页操作,这个换页操作是十分消耗主机 CPU 资源的。

     

    3.3、mpstat命令监控系统CPU

    如果你的系统有多个处理器核心,你就可以使用 mpstat 工具来监测每个核心。linux 内核把一个双核处理器当做 2 个 CPU,所以一个拥有 2 颗双核心的系统将被视为 4CPU。

    # mpstat –P ALL 1

    10:48:59 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest   %idle
    10:48:59 PM  all    0.32    0.00    0.22    0.07    0.01    0.01    0.00    0.00   99.37

    3.4、利用sar命令监控系统CPU

    sar功能很强大,可以对系统的每个方面进行单独的统计,但是使用sar命令会增加系统开销,不过这些开销是可以评估的,对系统的统计结果不会有很大影响。

     下面是sar命令对某个系统的CPU统计输出:

    [root@webserver ~]# sar -u 3 5

    Linux 2.6.9-42.ELsmp (webserver)        11/28/2008      _i686_  (8 CPU)

    11:41:24 AM     CPU     %user     %nice   %system   %iowait    %steal     %idle

    11:41:27 AM     all      0.88      0.00      0.29      0.00      0.00     98.83

    11:41:30 AM     all      0.13      0.00      0.17      0.21      0.00     99.50

    11:41:33 AM     all      0.04      0.00      0.04      0.00      0.00     99.92

    11:41:36 AM     all      90.08     0.00      0.13      0.16      0.00     9.63

    11:41:39 AM     all      0.38      0.00      0.17      0.04      0.00     99.41

    Average:        all      0.34      0.00      0.16      0.05      0.00     99.45      

    如果是查看每个核心的状况,也可以使用

    sar -P ALL 1 1

    对上面每项的输出解释如下:

    l        %user列显示了用户进程消耗的CPU 时间百分比。

    l        %nice列显示了运行正常进程所消耗的CPU 时间百分比。

    l        %system列显示了系统进程消耗的CPU时间百分比。

    l        %iowait列显示了IO等待所占用的CPU时间百分比

    l        %steal列显示了在内存相对紧张的环境下pagein强制对不同的页面进行的steal操作 。

    l        %idle列显示了CPU处在空闲状态的时间百分比。

     具体参考LinuxCPU利用率计算原理及内核实现(http://ilinuxkernel.com/?p=333)

    问题

    1.你是否遇到过系统CPU整体利用率不高,而应用缓慢的现象?

           在一个多CPU的系统中,如果程序使用了单线程,会出现这么一个现象,CPU的整体使用率不高,但是系统应用却响应缓慢,这可能是由于程序使用单线程的原因,单线程只使用一个CPU,导致这个CPU占用率为100%,无法处理其它请求,而其它的CPU却闲置,这就导致了整体CPU使用率不高,而应用缓慢现象的发生。

     

    3.5、小结

    CPU 的性能监测包含以下部分:
    * 1)检查系统运行队列并确保每个核心上不超过 3 个可运行进程
    * 2)确保 CPU 利用率的用户时间和系统时间在 70/30 之间
    * 3)当 CPU 花费更多的时间在 system mode 上时,更有可能是因过载而试图重新调度优先级
    * 4)运行 CPU 限制型应用比 IO 限制型应用更易出现性能瓶颈

     

     

     

    其他:QPS/TPS/并发量/吞吐量的概念


    QPS =  请求数/秒:每秒钟处理完请求的次数;注意这里是处理完,具体是指发出请求到服务器处理完成功返回结果。

    TPS:每秒钟处理完的事务次数,一般TPS是对整个系统来讲的。一个应用系统1s能完成多少事务处理,一个事务在分布式处理中,可能会对应多个请求,对于衡量单个接口服务的处理能力,用QPS比较多。

    并发量:系统能同时处理的请求数

    RT:响应时间,处理一次请求所需要的平均处理时间

    吞吐量:指在一次性能测试过程中网络上传输的数据量的总和。

    对于交互式应用来说,吞吐量指标反映的是服务器承受的压力,在容量规划的测试中,吞吐量是一个重点关注的指标,因为它能够说明系统级别的负载能力,另外,在性能调优过程中,吞吐量指标也有重要的价值。如一个大型工厂,他们的生产效率与生产速度很快,一天生产10W吨的货物,结果工厂的运输能力不行,就两辆小型三轮车一天拉2吨的货物,比喻有些夸张,但我想说明的是这个运输能力是整个系统的瓶颈。

    提示,用吞吐量来衡量一个系统的输出能力是极其不准确的,用个最简单的例子说明,一个水龙头开一天一夜,流出10吨水;10个水龙头开1秒钟,流出0.1吨水。当然是一个水龙头的吞吐量大。你能说1个水龙头的出水能力是10个水龙头的强?所以,我们要加单位时间,看谁1秒钟的出水量大。这就是吞吐率。

    吞吐率:单位时间内网络上传输的数据量,也可以指单位时间内处理客户请求数量。

    吞吐率是衡量网络性能的重要指标,通常情况下,吞吐率用“字节数/秒”来衡量,当然,你可以用“请求数/秒”和“页面数/秒”来衡量。其实,不管是一个请求还是一个页面,它的本质都是在网络上传输的数据,那么来表示数据的单位就是字节数。

    不过以不同的方式表达的吞吐量可以说明不同层次的问题。例如,以字节数/秒方式表示的吞吐量主要受网络基础设置、服务器架构、应用服务器制约;以请求数/秒方式表示的吞吐量主要受应用服务器和应用代码的制约。

    但是从业务的角度看,吞吐率也可以用“业务数/小时或天”、“访问人数/小时或天”、“页面访问量/小时或天”来衡量。例如,在银行卡审批系统中,可以用“千件/小时”来衡量系统的业务处理能力。那么,从用户的角度,一个表单提交可以得到一次审批。又引出来一个概念---事务。

     

    QPS计算PV和机器的方式】

    QPS = 请求数/秒,统计方式 一般使用 http_load 进行统计。
    QPS = 总请求数 / ( 进程总数 *   请求时间 )
    QPS: 单个进程每秒请求服务器的成功次数

    单台服务器每天PV计算
    公式1:每天总PV = QPS * 3600 * 6
    公式2:每天总PV = QPS * 3600 * 8

    服务器计算
    服务器数量 =   ceil( 每天总PV / 单台服务器每天总PV )

    【峰值QPS和机器计算公式】

    原理:每天80%的访问集中在20%的时间里,这20%时间叫做峰值时间
    公式:( 总PV数 * 80% ) / ( 每天秒数 * 20% ) = 峰值时间每秒请求数(QPS)
    机器:峰值时间每秒QPS / 单台机器的QPS   = 需要的机器

    问:每天300w PV 的在单台机器上,这台机器需要多少QPS
    答:( 3000000 * 0.8 ) / (86400 * 0.2 ) = 139 (QPS)

    问:如果一台机器的QPS是58,需要几台机器来支持?
    答:139 / 58 = 3

     

    注意:如果 r经常大于 4 ,且id经常少于40,表示cpu的负荷很重。

              如果si,so 长期不等于0,表示内存不足。

              如果disk 经常不等于0, 且在 b中的队列大于3, 表示 io性能不好。

     

    感谢您的支持,我会继续努力的! 扫码打赏,你说多少就多少

             

     

     

    展开全文
  • Linux操作系统性能调优的方法 2013-03-18 15:35 HonestQiaoChinaUnix字号:T|T Linux是一套免费使用和自由传播的类Unix操作系统,Linux不同的发行版本和不同的内核对各项参数及设置均做了改动,从而使得...

    Linux操作系统性能调优的方法

    2013-03-18 15:35 HonestQiao ChinaUnix 字号:T | T
    一键收藏,随时查看,分享好友!

    Linux是一套免费使用和自由传播的类Unix操作系统,Linux不同的发行版本和不同的内核对各项参数及设置均做了改动,从而使得系统能够获得更好的性能。本文分享了几种技巧对Linux操作系统进行性能的优化。

    AD:2014WOT全球软件技术峰会北京站 课程视频发布

     

    按照传统,Linux不同的发行版本和不同的内核对各项参数及设置均做了改动,从而使得系统能够获得更好的性能。下边将分四部分介绍在Red Hat Enterprise Linux AS和SUSE LINUX Enterprise Server系统下,如何用以下几种技巧进行性能的优化:

    QUOTE:

    1、Disabling daemons (关闭 daemons)

    2、Shutting down the GUI (关闭GUI)

    3、Changing kernel parameters (改变内核参数)

    4、Kernel parameters (内核参数)

    5、Tuning the processor subsystem(处理器子系统调优)

    6、Tuning the memory subsystem (内存子系统调优)

    7、Tuning the file system(文件系统子系统调优)

    8、Tuning the network subsystem(网络子系统调优)

    1 关闭daemons

    有些运行在服务器中的daemons (后台服务),并不是完全必要的。关闭这些daemons可释放更多的内存、减少启动时间并减少CPU处理的进程数。减少daemons数量的同时也增强了服务器的安全性。缺省情况下,多数服务器都可以安全地停掉几个daemons。

    Table 10-1列出了Red Hat Enterprise Linux AS下的可调整进程.

    Table 10-2列出了SUSE LINUX Enterprise Server下的可调整进程. 

    注意:关闭xfs daemon将导致不能启动X,因此只有在不需要启动GUI图形的时候才可以关闭xfs daemon。使用startx命令前,开启xfs daemon,恢复正常启动X。

    可以根据需要停止某个进程,如要停止sendmail 进程,输入如下命令:

    Red Hat: /sbin/service sendmail stop
    SUSE LINUX: /etc/init.d/sendmail stop

    也可以配置在下次启动的时候不自动启动某个进程,还是sendmail:

    Red Hat: /sbin/chkconfig sendmail off
    SUSE LINUX: /sbin/chkconfig -s sendmail off

    除此之外,LINUX还提供了图形方式下的进程管理功能。对于Red Hat,启动GUI,使用如下命令: /usr/bin/redhat-config-services 或者鼠标点击 Main Menu -> System Settings ->

    Server Settings -> Services.

     

    提示:并非所有的daemons都会显示在该配置界面,如要看到全部的daemons,使用如下命令:

    /sbin/chkconfig –list

    对于SUSE LINUX,图形界面是YaST2, 可用如下命令来启动

    /sbin/yast2 runlevel 或者如Figure 10-2所示用鼠标点击

    Browse: YaST/ ?> YaST modules ?> System ?> Runlevel editor

     

    2 关闭GUI

    只要有可能,就不要在Linux server上启动GUI图形,通常在Linux server上,没有必要启动GUI。,所有的管理任务均可在命令行方式下完成、或者通过重定向X和Web浏览器界面。有几个可用的基于Web的工具(例如webmin, Linuxconf, 和SWAT).

    需要的时候启动GUI,用完马上关闭GUI。多数情况,服务器运行在runlevel 3,即在机器启动的时候不进入GUI。命令行方式下,执行startx 来启动Xserver.

    1. 查看runlevel的命令:runlevel

    会显示出上次和当前的runlevel (如N 5 表示没有上次的runlevel (N) ,当前的runlevel是5).

    2. 在不同的runlevels之间切换,使用命令 init

    如切换到run level 3,键入命令init 3

    下边是对Linux中不同runlevels的简要描述

    – 0 – Halt 停机(不要将0设置为缺省,否则服务器启动后就会马上关闭)

    – 1 - Single user mode 单用户模式

    – 2 - Multi-user 不带NFS的多用户模式 (如果没有网络,相当与3)

    – 3 - Full multi-user mode 完全多用户模式

    – 4 – Unused 未使用

    – 5 - X11

    – 6 – Reboot 重启(不要将6设置为缺省,否则服务器会不断地重启)

    修改文件/etc/inittab 来设置机器启动的runlevel,如Figure 10-3。

    对于SUSE LINUX Enterprise Server, 执行YaST runlevel 命令改变缺省runlevel值.

    如图Figure 10-2。

    缺省情况下,保存了6个控制台:F1……F6。为节省内存,可以减少为3个。使用mingetty ttyx命令来实现,如图Figure 10-3

    提示:即便是已经关闭了GUI,依然可以远程连接并启动GUI,可以使用ssh-x。

    3 改变内核参数

    Linux内核是操作系统的核心,对所有的Linux发行版本是通用的。内核参数可以改变,在命令行下执行sysctl 命令。

    提示:缺省情况下,LINUX内核包括不必重启就可以使用sysctl命令的必要的模块。尽管如此,如果你在安装系统的时候选择移除该功能,那么你只有重新启动LINUX,才可以使得改变生效。

    SUSE LINUX 提供了图形界面下的修改方式。使用如下命令来启动powertweak工具:

    /sbin/yast powertweak

    使用如下命令启动基于字符的管理菜单:

    /sbin/yast2 powertweak

    Red Hat也提供了图形界面下更改sysctl参数的方式:

    /usr/bin/redhat-config-proc

    如图Figure 10-5:

    Parameter storage locations

    内核参数保存在/proc(特别是/proc/sys),提供了内核、处理器、内存、网络及其他组件的相关参数。每个执行的进程都有一个以相应PID命名的目录。Figure 10-3列出了一些包括内核信息的文件。

    4 内核的参数

    Table 10-5 列出了Red Hat V2.4与性能关系密切的一些内核参数。

     

     

     5 处理器子系统调优

    处理器对于应用和数据库服务器来讲是最重要的硬件子系统之一。然而在这些系统中,CPU经常是性能的瓶颈。

    在配有Xeon处理器的高端服务器中,你可以启用或者关闭Hyper-Threading(超线程功能)。Hyper-Threading在操作系统里将一颗处理器虚拟化为两颗使用。Red Hat Enterprise Linux AS和SUSE LINUX Enterprise Server都支持该功能,从而可以使处理器在同一时刻执行两个线程或者进程。对于支持Hyper-Threading的操作系统和软件来说,不需要增加CPU时钟频率即可使性能得到明显的改进。例如,在4路的服务器上起用Hyper-Threading功能并使用性能监测工具(如top)来检测,可以看到8颗处理器。如图Figure 10-6

    提示,对于Hyper-Threading:

    _ 基于SMP内核的LINUX才可以支持Hyper-Threading

    _ 安装的CPU数量越多,从Hyper-Threading获得的性能上的提高就越少。可获得的性能提高大约为:

    – 2颗物理CPU: 15-25%

    – – 4颗物理CPU: 1-13%

    – – 8颗物理CPU: 0-5%

    – 如需更多的关于Hyper-Threading信息,可查看更多

    EM64T是Intel IA-32处理器的64-bit扩展。意思是,处理器能够支持更多的内存并支持64-bit应用同时完全兼容现存的32-bit应用。Red Hat Enterprise Linux 3 Update 2 和 SUSE LINUX Enterprise Server 9支持这种新的处理器。如需更多的EM64T信息,可查看更多

    选择正确的内核

    Red Hat Enterprise Linux AS和SUSE LINUX Enterprise Server都包括有若干个内核包,如Table 10-6所列。选择合适的内核对性能非常重要。

     

    6 内存子系统的调优

    内存子系统的调优不是很容易,需要不停地监测来保证内存的改变不会对服务器的其他子系统造成负面影响。如果要改变虚拟内存参数(在/proc/sys/vm),建议您每次只改变一个参数然后监测效果。对与虚拟内存的调整包括以下几个项目:

    配置Linux内核如何更新dirty buffers到磁盘。磁盘缓冲区用于暂存磁盘的数据。相对于内存来讲,磁盘缓冲区的速度很慢。因此,如果服务器使用这类内存,性能会成问题。当缓冲区内的数据完全dirty,使用:sysctl -w vm.bdflush="30 500 0 0 500 3000 60 20 0"

    vm.bdflush有9个参数,但是建议您只改变其中的3个:

    • nfract, 为排队写入磁盘前,bdflush daemon允许的缓冲区最大百分比
    • ndirty, 为bdflush即刻写的最大缓冲区的值。如果这个值很大,bdflush需要更多的时间完成磁盘的数据更新。
    • nfract_sync, 发生同步前,缓冲区变dirty的最大百分比

    配置kswapd daemon,指定Linux的内存交换页数量

    sysctl -w vm.kswapd="1024 32 64"

    三个参数的描述如下:

    – tries_base 相当于内核每次所交换的“页”的数量的四倍。对于有很多交换信息的系统,增加这个值可以改进性能。

    – tries_min 是每次kswapd swaps出去的pages的最小数量。

    – swap_cluster 是kswapd 即刻写如的pages数量。数值小,会提高磁盘I/O的性能;数值大可能也会对请求队列产生负面影响。

    如果要对这些参数进行改动,请使用工具vmstat检查对性能的影响。其它可以改进性能的虚拟内存参数为:

    _ buffermem
    _ freepages
    _ overcommit_memory
    _ page-cluster
    _ pagecache
    _ pagetable_cache

     

    7 网络子系统的调优

    操作系统安装完毕,就要对网络子系统进行调优。对其它子系统的影响:影响CPU利用率,尤其在有大量TCP连接、块尺寸又非常小时,内存的使用会明显增加。

    如何预防性能下降

    如下的sysctl命令用于改变安全设置,但是它也可以防止网络性能的下降。这些命令被设置为缺省值。

    ◆关闭如下参数可以防止黑客对服务器IP地址的攻击

    Click here to open new window

    ◆开启TCP SYN cookies,保护服务器避免受syn-flood攻击,包括服务取决denial-of-service (DoS) 或者分布式服务拒绝distributed denial-of-service (DDoS) (仅适用Red Hat Enterprise Linux AS)

    Click here to open new window

    ◆以下命令使服务器忽略来自被列入网关的服务器的重定向。因重定向可以被用来进行攻击,所以我们只接受有可靠来源的重定向。

    Click here to open new window

     

    另外,你可以配置接受或拒绝任何ICMP重定向。ICMP重定向是路由器传输路由信息的机制。比如,当网关接收到来自所接网络主机的Internet数据报时,网关可以发送重定向信息到一台主机。网关检查路由表获得下一个网关的地址,第二个网关将数据报路由到目标网络.关闭这些重定向得命令如下:

    Click here to open new window

    ◆如果这个服务器不是一台路由器,那么它不会发送重定向,所以可以关闭该功能:

    Click here to open new window

    ◆配置服务器拒绝接受广播风暴或者smurf 攻击attacks:

    Click here to open new window

    ◆忽略所有icmp包或者pings:

    ◆有些路由器针对广播祯发送无效的回应,每个都产生警告并在内核产生日志.这些回应可以被忽略:

    Click here to open new window

      8.针对TCP和UDP的调优

    下边的命令用来对连接数量非常大的服务器进行调优。

    ◆对于同时支持很多连接的服务器,新的连接可以重新使用TIME-WAIT套接字. 这对于Web服务器非常有效:

    如果你使用该命令,还要启动TIME-WAIT 套接字状态的快速循环功能:

    图Figure 10-7显示出将这些功能启用,连接数量明显降低.因为每个TCP传输都包含远程客户端的协议信息缓存,所以有利于提高性能.缓存中存放round-trip时间、最大segment大小、拥塞窗口的信息。

    Click here to open new window

    ◆参数tcp_fin_timeout 是套接字关闭时,保持FIN-WAIT-2状态的时间。一个TCP连接以three-segment SYN序列开始, 以three-segment FIN序列结束.均不保留数据.通过改变tcp_fin_timeout的值, 从FIN序列到内存可以空闲出来处理新连接的时间缩短了,使性能得到改进.改变这个值的前要经过认真的监测,避免因为死套接字造成内存溢出.

    ◆服务器的一个问题是,同一时刻的大量TCP连接里有很多的连接被打开但是没有使用. TCP的keepalive功能检测到这些连接,缺省情况下,在2小时之后丢掉. 2个小时的可能导致内存过度使用,降低性能.因此改成1800秒(30分钟)是个更好的选择:

    ◆对于所有协议的队列,设置最大系统发送缓存(wmem) 和接收缓存(rmem)到8MB

    这些设置指定了创建TCP套接字时为其分配的内存容量. 另外,使用如下命令发送和接收缓存.该命令设定了三个值:最小值、初始值和最大值:

    第三个值必须小于或等于wmem_max和rmem_max。

    ◆(SUSE LINUX Enterprise Server适用) 通过保留路径验证来源数据包。缺省情况下,路由器转发所有的数据包,即便是明显的异常网络流量。通过启动和是的过滤功能,丢掉这些数据包:

    ◆当服务器负载繁重或者是有很多客户端都是超长延时的连接故障,可能会导致half-open连接数量的增加。这对于Web服务器很来讲很平常,尤其有很多拨号客户时.这些half-open连接保存在 backlog connections 队列中.将这个值最少设置为4096 (缺省为1024). 即便是服务器不接收这类连接,设置这个值还能防止受到denial-of-service (syn-flood)的攻击.

    ◆设置ipfrag参数,尤其是NFS和Samba服务器。这里,我们可以设置用于重新组合IP碎片的最大、最小内存。当ipfrag_high_thresh值被指派,碎片会被丢弃直到达到ipfrag_low_thres值。

    当TCP数据包传输发生错误时,开始碎片整理。有效的数据包保留在内存,同时损坏的数据包被转发。例如,设置可用内存范围从256 MB到384 MB

    【编辑推荐】

    转载于:https://www.cnblogs.com/L-H-R-X-hehe/p/3963442.html

    展开全文
  • 1、总结系统限制有: /proc/sys/kernel/pid_max #查系统支持的最大线程数,一般会很大,相当于理论  /proc/sys/kernel/threads-max  max_user_process #系统限制某用户下最多可以运行多少进程或线程,使用...

    1、总结系统限制有:
        /proc/sys/kernel/pid_max #查系统支持的最大线程数,一般会很大,相当于理论值

       
        /proc/sys/kernel/threads-max

       
        max_user_process #系统限制某用户下最多可以运行多少进程或线程,使用命令:ulimit -u

       

        注:修改max_user_process的数值,只需要修改/etc/security/limits.conf即可,但是这个参数需要修改/etc/security/limits.d/90-nproc.conf

        附录:
      附录1:centos 6.*可以修改/etc/security/limits.d/90-nproc.conf
      我这边是通过修改/etc/security/limits.conf,在最后添加
      * soft nproc 65535
      * hard nproc 65535

        查看默认的线程栈大小,单位是字节(Bytes),使用命令:ulimit -s

       
        /proc/sys/vm/max_map_count #硬件内存大小
        


    2、Java虚拟机本身限制:
        -Xms  #intial java heap size
        -Xmx  #maximum java heap size
        -Xss  #the stack size for each thread


    3、查询当前某程序的线程或进程数
    # pstree -p `ps -e | grep java | awk '{print $1}'` | wc -l

    上面用的是命令替换,关于命令替换,就是说用``括起来的命令会优先执行,然后以其输出作为其他命令的参数

    # pstree -p 进程号 | wc -l

    # top -H 进程号 | wc -l

    上面用的是管道,关于管道:管道符号"|"左边命令的输出作为右边命令的输入


    4、查询当前整个系统已用的线程或进程数
    pstree -p | wc -l

     

     

    转载自:http://blog.csdn.net/wang7dao/article/details/16369381

    展开全文
  • linux系统下pid的取值范围

    万次阅读 2012-03-05 19:55:08
    现在的内核好像没有这个限制了,《linux内核设计与实现》上说为了与老版本的unix和linux兼容,pid的最大默认是32767(short int的最大),如果你需要的话还可以不考虑和老版本兼容,修改/proc/sys/kernel/pid_
  • linux pid

    千次阅读 2018-11-30 09:45:48
    转发自https://www.cnblogs.com/hazir/p/linux_kernel_pid.html 进程ID类型 要想了解内核如何来组织和管理进程ID,先要知道...在使用 fork 或 clone 系统调用时产生的进程均会由内核分配一个新的唯一的PID值。 T...
  • Linux内核原理-pid namespace

    千次阅读 2016-08-28 13:00:57
    前言这几晚在看进程相关的内核原理,正好看到了pid这块,看起来不是复杂,但是引入了pid namespace后增加了一些数据结构,看起来不是那么清晰了,参考了Linux内核架构这本书,看完后感觉还没有理解。所以就在网上...
  • linux virt res shr这是值很大代表什么

    千次阅读 2016-10-12 17:19:30
    VIRT:virtual memory usage 虚拟内存 1、进程“需要的”虚拟内存大小,包括进程使用的库、代码、数据等 2、假如进程申请100m的内存,但实际只使用了10m,那么它会增长100m,而不是实际的使用量 ...
  • Linux/Unix下pid文件作用浅析

    万次阅读 2013-05-10 15:35:38
    Linux系统的目录/var/run下面一般我们都会看到多的*.pid文件。而且往往新安装的程序在运行后也会在/var/run目录下面产生自己的pid文件。那么这些pid文件有什么作用呢?它的内容又是什么呢?(1) pid文件的内容:...
  • linux内核PID管理

    万次阅读 2011-09-10 17:14:04
    PID即进程描述符在linux kernel中的分配和管理比较复杂。 本文分析了其相关数据结构以及函数。 (代码基于v3.0.3) 和PID相关的数据结构有 struct pid { atomic_t count; unsigned int level; struct h
  • linux/unix下 pid文件作用浅析

    千次阅读 2016-10-17 20:52:16
    l在linux系统的目录/var/run下面一般我们都会看到多的*.pid文件。而且往往新安装的程序在运行后也会在/var/run目录下面产生自己的pid文件。那么这些pid文件有什么作用呢?它的内容又是什么呢?  (1) pid文件...
  • linux内核-分配PID位图算法

    千次阅读 2012-03-03 12:13:50
    linux内核-分配PID位图算法: 在linux中(kernel/pid.c),提供了一种生成唯一PID的机制,用到一种位图算法。 什么是位图算法:它的特点是生成的是整数,而且是唯一的,限定在某个范围内。 内核既要分配唯一的...
  • linux内核PID管理--命名空间

    千次阅读 2016-03-08 16:00:40
    PID即进程描述符在linux kernel中的分配和管理比较复杂。 本文分析了其相关数据结构以及函数。 (代码基于v3.0.3) 和PID相关的数据结构有   [cpp] view plaincopy struct pid  {  ...
  • Linux--get_pid函数分析

    千次阅读 2008-01-22 15:58:00
    导读: get_pid函数的意图明显,就是找到一个pid分配给进程。首先变量last_pid,用于记录上一次分配给进程时的pid值。而分配的过程,一般而言是last_pid+1,如果超出进程个数的最大(0x7fff),那么进程pid值从...
  • linux系统中ulimit查看和更改系统限制ulimitulimit用于shell启动进程所占用的资源,可以用来设置系统的限制语法格式 ulimit [-acdfHlmnpsStvw] [size] 在/etc/security/limits.conf文件中定义 限制。 命令参数 ...
  • 每个人都知道 PID,究竟什么是 PID?为什么你想要 PID?你打算用 PID 做什么?你脑子里有同样的问题吗?如果是这样,你就找对地方了解这些细节了。-- Magesh Maruthamuthu本文导航◈ 什么是进程 ID?08%◈ 方法 1:...
  • 有时候需要在Linux下查看一个进程占用了那个端口,但是只知道进程大致的名称,比如要查看Hadoop的namenode在哪个端口上运行,以便在eclipse中连接。一种方法如下,可能比较搓,请牛指教! 首先用ps命令查看进程的...
  • 使用linux操作系统,难免遇到一些软件"卡壳"的问题,这时就需要使用linux下强大的kill命令来结束相关进程。这在linux系统下是极其容易的事情,你只需要kill xxx即可,这里xxx代表与此软件运行相关的进程PID号...
  • linux syscall系统调用获取线程PID

    千次阅读 2015-09-05 17:40:42
    linux syscall系统调用获取线程PID线程idLinux中,每个进程有一个pid,类型pid_t,由getpid()取得。Linux下的POSIX线程也有一个id,类型 pthread_t,由pthread_self()取得,该id由线程库维护,其id空间是各个进程...
  • 每个人都知道 PID,究竟什么是 PID?为什么你想要 PID?你打算用 PID 做什么?你脑子里有同样的问题吗?如果是这样,你就找对地方了解这些细节了。 我们查询 PID 主要是用来杀死一个没有响应的程序,它类似于 ...
1 2 3 4 5 ... 20
收藏数 132,316
精华内容 52,926
关键字:

linux pid 值很大