精华内容
下载资源
问答
  • 我们打开ArrayList的源码可以看到作者是有解析的: ...*要分配的数组的最大大小。 *一些vm在数组中保留一些头字。 *尝试分配较大的数组可能会导致 *OutOfMemory错误:请求的数组大小超过了虚拟机限制 */ ...

    我们打开ArrayList的源码可以看到作者是有解析的:
    在这里插入图片描述
    /**
    *要分配的数组的最大大小。
    *一些vm在数组中保留一些头字。
    *尝试分配较大的数组可能会导致
    *OutOfMemory错误:请求的数组大小超过了虚拟机限制
    */

    展开全文
  • php中file_get_contents如何读取大容量文件 一、总结 一句话总结:使用file_get_contents()进行分段读取,file_get_contents()函数可以分段读取   1、读取大文件是,file_get_contents()函数为什么会发生错误?...

    php中file_get_contents如何读取大容量文件

    一、总结

    一句话总结:使用file_get_contents()进行分段读取,file_get_contents()函数可以分段读取

     

    1、读取大文件是,file_get_contents()函数为什么会发生错误?

    发生内存溢出而打开错误

    当我们遇到文本文件体积很大时,比如超过几十M甚至几百M几G的大文件,用记事本或者其它编辑器打开往往不能成功,因为他们都需要把文件内容全部放到内存里面,这时就会发生内存溢出而打开错误

    因为file_get_contents()只能读取长度为 maxlen 的内容

     

    2、file_get_contents()函数的机制是什么?

    file_get_contents() 把文件读入一个字符串。将在参数 offset 所指定的位置开始读取长度为 maxlen 的内容。如果失败,file_get_contents() 将返回 FALSE。

     

    3、file_get_contents()函数如何读取大文件?

    使用file_get_contents()进行分段读取

    $str = $content=file_get_contents("2.sql",FALSE,NULL,1024*1024,1024);
    echo $str;

     

    $u ='www.bKjia.c0m'; //此文件为100GB

    $a =file_get_contents( $u,100,1000 );

    读取成功了

     

     

    4、fread()函数如何分段读取?

    其实就是判断文件是否结束,没结束就一直读

    $fp=fopen('2.sql','r');
    while (!feof($fp)){
    $str.=fread($fp, filesize ($filename)/10);//每次读出文件10分之1

     

    5、如何设置file_get_contents函数的超时时间?

    <?php
    //设置超时参数
    $opts=array( "http"=>array( "method"=>"GET", "timeout"=>3 ), ); 创建数据流上下文 $context = stream_context_create($opts); //$url请求的地址,例如: $result =file_get_contents($url, false, $context); // 打印结果 print_r($result); ?>

     

     

     

    二、php 使用file_get_contents读取大文件的方法

    当我们遇到文本文件体积很大时,比如超过几十M甚至几百M几G的大文件,用记事本或者其它编辑器打开往往不能成功,因为他们都需要把文件内容全部放到内存里面,这时就会发生内存溢出而打开错误,遇到这种情况我们可以使用PHP的文件读取函数file_get_contents()进行分段读取

    函数说明
    string file_get_contents ( string $filename [, bool $use_include_path [, resource $context [, int $offset [, int $maxlen ]]]] )
    和 file() 一样,只除了 file_get_contents() 把文件读入一个字符串。将在参数 offset 所指定的位置开始读取长度为 maxlen 的内容。如果失败,file_get_contents() 将返回 FALSE。

    file_get_contents() 函数是用来将文件的内容读入到一个字符串中的首选方法。如果操作系统支持还会使用内存映射技术来增强性能。

    应用:

    代码如下:

    $str = $content=file_get_contents("2.sql",FALSE,NULL,1024*1024,1024);
    echo $str;

    如果针对较小文件只是希望分段读取并以此读完可以使用fread()函数

    代码如下:

    $fp=fopen('2.sql','r');
    while (!feof($fp)){
    $str.=fread($fp, filesize ($filename)/10);//每次读出文件10分之1
    //进行处理
    }

    echo $str;

    以上就是如何使用file_get_contents函数读取大文件的方法,超级简单吧,需要的小伙伴直接搬走!

     

     

    参考:php 使用file_get_contents读取大文件的方法_php技巧_脚本之家
    https://www.jb51.net/article/57380.htm

     

    三、解决php中file_get_contents 读取大文件返回false问题

    file_get_contents文件是用来读写文件的,但我发现用file_get_contents 读取大文件出错提示Note: string can be as large as 2GB了,这个就是不能超过2G了,有没有办法解决呢,下面我来一起来看。

    如果我读取一个 www.bKjia.c0m文件

     代码如下
    复制代码

    $u ='www.bKjia.c0m'; //此文件为100GB

    $a =file_get_contents( $u );

    运行提示

    Note: string can be as large as 2GB

    不能大于2GB了,我们去官方看此函数参考

    string file_get_contents ( string $filename [, bool $use_include_path = false [, resource $context [, int $offset = -1 [, int $maxlen ]]]] )

    发现有个

     file_get_contents() 把文件读入一个字符串。将在参数 offset 所指定的位置开始读取长度为 maxlen 的内容。如果失败, file_get_contents() 将返回 FALSE。

    原来如此,这样我们对程序进行修改即可

     代码如下
    复制代码

    $u ='www.bKjia.c0m'; //此文件为100GB

    $a =file_get_contents( $u,100,1000 );

    读取成功了

    总结

    file_get_contents如果正常返回,会把文件内容储存到某个字符串中,所以它不应该返回超过2G长度的字符串。

    如果文件内容超过2G,不加offset和maxlen调用file_get_contents的话,肯定会返回false,

     

     

    参考:解决php中file_get_contents 读取大文件返回false问题 | E网新时代
    http://www.jxtobo.com/56854.html

     
     

    四、PHP中file_get_contents($url)的超时处理

    PHP中file_get_contents函数的作用是获取一个 URL 的返回内容。如果是url响应速度慢,或者网络等因素,会造成等待时间较长的情况。只需设置一下file_get_contents函数的超时时间即可解决。示例代码如下:

    <?php
    //设置超时参数
    $opts=array(
            "http"=>array(
                    "method"=>"GET",
                    "timeout"=>3
                    ),
            );
    创建数据流上下文
    $context = stream_context_create($opts);
    
    //$url请求的地址,例如:
    
    $result =file_get_contents($url, false, $context);
    
    // 打印结果
    print_r($result);
    
    ?>

     

    参考:PHP中file_get_contents($url)的超时处理 - CSDN博客
    https://blog.csdn.net/mayuko2012/article/details/76092312

     

     

     
    展开全文
  • 锋影 ... ...     ...当磁盘大小超过标准时会有报警提示,这时如果掌握df和du命令是非常... df可以查看一级文件夹大小、使用比例、档案系统及其挂入点,但对文件却无能为力。  du可以查看文件及文件夹的大小。  两...

    锋影

    email:174176320@qq.com

    如果你认为本系列文章对你有所帮助,请大家有钱的捧个钱场,点击此处赞助,赞助额0.1元起步,多少随意

     

     

     

    当磁盘大小超过标准时会有报警提示,这时如果掌握df和du命令是非常明智的选择。

        df可以查看一级文件夹大小、使用比例、档案系统及其挂入点,但对文件却无能为力。
        du可以查看文件及文件夹的大小。

        两者配合使用,非常有效。比如用df查看哪个一级目录过大,然后用df查看文件夹或文件的大小,如此便可迅速确定症结。

        下面分别简要介绍

        df命令可以显示目前所有文件系统的可用空间及使用情形,请看下列这个例子:

     

     

    以下是代码片段:

    [yayug@yayu ~]$ df -h
    Filesystem            Size  Used Avail Use% Mounted on
    /dev/sda1             3.9G  300M  3.4G   8% /
    /dev/sda7             100G  188M   95G   1% /data0
    /dev/sdb1             133G   80G   47G  64% /data1
    /dev/sda6             7.8G  218M  7.2G   3% /var
    /dev/sda5             7.8G  166M  7.2G   3% /tmp
    /dev/sda3             9.7G  2.5G  6.8G  27% /usr
    tmpfs                 2.0G     0  2.0G   0% /dev/shm

     

     

        参数 -h 表示使用「Human-readable」的输出,也就是在档案系统大小使用 GB、MB 等易读的格式。

        上面的命令输出的第一个字段(Filesystem)及最后一个字段(Mounted on)分别是档案系统及其挂入点。我们可以看到 /dev/sda1 这个分割区被挂在根目录下。

        接下来的四个字段 Size、Used、Avail、及 Use% 分别是该分割区的容量、已使用的大小、剩下的大小、及使用的百分比。 FreeBSD下,当硬盘容量已满时,您可能会看到已使用的百分比超过 100%,因为 FreeBSD 会留一些空间给 root,让 root 在档案系统满时,还是可以写东西到该档案系统中,以进行管理。

        du:查询文件或文件夹的磁盘使用空间

        如果当前目录下文件和文件夹很多,使用不带参数du的命令,可以循环列出所有文件和文件夹所使用的空间。这对查看究竟是那个地方过大是不利的,所以得指定深入目录的层数,参数:--max-depth=,这是个极为有用的参数!如下,注意使用“*”,可以得到文件的使用空间大小.

        提醒:一向命令比linux复杂的FreeBSD,它的du命令指定深入目录的层数却是比linux简化,为 -d。

     

     

    以下是代码片段:

    [root@bsso yayu]# du -h --max-depth=1 work/testing
    27M     work/testing/logs
    35M     work/testing

    [root@bsso yayu]# du -h --max-depth=1 work/testing/*
    8.0K    work/testing/func.php
    27M     work/testing/logs
    8.1M    work/testing/nohup.out
    8.0K    work/testing/testing_c.php
    12K     work/testing/testing_func_reg.php
    8.0K    work/testing/testing_get.php
    8.0K    work/testing/testing_g.php
    8.0K    work/testing/var.php

    [root@bsso yayu]# du -h --max-depth=1 work/testing/logs/
    27M     work/testing/logs/

    [root@bsso yayu]# du -h --max-depth=1 work/testing/logs/*
    24K     work/testing/logs/errdate.log_show.log
    8.0K    work/testing/logs/pertime_show.log
    27M     work/testing/logs/show.log

     

     

        值得注意的是,看见一个针对du和df命令异同的文章:《du df 差异导致文件系统误报解决》。

        du 统计文件大小相加 
        df  统计数据块使用情况

        如果有一个进程在打开一个大文件的时候,这个大文件直接被rm 或者mv掉,则du会更新统计数值,df不会更新统计数值,还是认为空间没有释放。直到这个打开大文件的进程被Kill掉。

        如此一来在定期删除 /var/spool/clientmqueue下面的文件时,如果没有杀掉其进程,那么空间一直没有释放。

        使用下面的命令杀掉进程之后,系统恢复。
        fuser -u /var/spool/clientmqueue

    http://www.yayu.org/look.php?id=162

     


     

     

    查看linux文件目录的大小和文件夹包含的文件数

        统计总数大小

        du -sh xmldb/

        du -sm * | sort -n //统计当前目录大小 并安大小 排序

        du -sk * | sort -n

        du -sk * | grep guojf //看一个人的大小

        du -m | cut -d "/" -f 2 //看第二个/ 字符前的文字

        查看此文件夹有多少文件 /*/*/* 有多少文件

        du xmldb/

        du xmldb/*/*/* |wc -l

        40752

        解释:

        wc [-lmw]

        参数说明:

        -l :多少行

        -m:多少字符

        -w:多少字

     

    http://linux.chinaitlab.com/command/734706.html


     

    Linux:ls以K、M、G为单位查看文件大小

    #man ls

    ……

    -h, --human-readable

                    print sizes in human readable format (e.g., 1K 234M 2G)

    ……

    # ls

    cuss.war    nohup.out

    # ls -l

    total 30372

    -rw-r--r--    1 root root 31051909 May 24 10:07 cuss.war

    -rw-------    1 root root          0 Mar 20 13:52 nohup.out

    # ls -lh

    total 30M

    -rw-r--r--    1 root root 30M May 24 10:07 cuss.war

    -rw-------    1 root root     0 Mar 20 13:52 nohup.out

    # ll -h

    total 30M

    -rw-r--r--    1 root root 30M May 24 10:07 cuss.war

    -rw-------    1 root root     0 Mar 20 13:52 nohup.out

    展开全文
  • linux系统中ulimit查看和更改系统限制ulimitulimit用于shell启动进程所...在/etc/security/limits.conf文件中定义 限制。 命令参数 描述 例子 -H 设置硬资源限制,一旦设置不能增加。 ulimit – Hs 64;限制硬

    ulimit命令查看和更改系统限制


    ulimit命令详解


    ulimit用于shell启动进程所占用的资源,可以用来设置系统的限制

    语法格式

    ulimit [-acdfHlmnpsStvw] [size]

    /etc/security/limits.conf文件中定义
    限制。

    命令参数描述例子
    -H设置硬资源限制,一旦设置不能增加。ulimit – Hs 64;限制硬资源,线程栈大小为 64K。
    -S设置软资源限制,设置后可以增加,但是不能超过硬资源设置。ulimit – Sn 32;限制软资源,32 个文件描述符。
    -a显示当前所有的 limit 信息ulimit – a;显示当前所有的 limit 信息
    -c最大的 core 文件的大小, 以 blocks 为单位ulimit – c unlimited; 对生成的 core 文件的大小不进行限制
    -d进程最大的数据段的大小,以 Kbytes 为单位ulimit -d unlimited;对进程的数据段大小不进行限制
    -f进程可以创建文件的最大值,以 blocks 为单位ulimit – f 2048;限制进程可以创建的最大文件大小为 2048 blocks
    -l最大可加锁内存大小,以 Kbytes 为单位ulimit – l 32;限制最大可加锁内存大小为 32 Kbytes
    -m最大内存大小,以 Kbytes 为单位ulimit – m unlimited;对最大内存不进行限制
    -n可以打开最大文件描述符的数量ulimit – n 128;限制最大可以使用 128 个文件描述符
    -p管道缓冲区的大小,以 Kbytes 为单位ulimit – p 512;限制管道缓冲区的大小为 512 Kbytes
    -s线程栈大小,以 Kbytes 为单位ulimit – s 512;限制线程栈的大小为 512 Kbytes
    -t最大的 CPU 占用时间,以秒为单位ulimit – t unlimited;对最大的 CPU 占用时间不进行限制
    -u用户最大可用的进程数ulimit – u 64;限制用户最多可以使用 64 个进程
    -v进程最大可用的虚拟内存,以 Kbytes 为单位ulimit – v 200000;限制最大可用的虚拟内存为 200000 Kbytes

    我们可以使用ulimit -a查看我们系统的所有限制

    ulimit -a

    当然我们都知道linux大部分的命令设置都是临时生效,而且ulimit命令只对当前终端生效

    如果需要永久生效的话,我们有两种方法,

    • 一种是将命令写至profile和bashrc中,相当于在登陆时自动动态修改限制

    • 还有一种就是在/etc/security/limits.conf中添加记录(需重启生效,并且在/etc/pam.d/中的seesion有使用到limit模块)。

    limits.conf文件附录


    在/etc/security/limits.conf修改限制的格式如下

    domino type item value

    参数描述
    domino是以符号@开头的用户名或组名,*表示所有用户
    type设置为hard or soft
    item指定想限制的资源。如cpu,core nproc or maxlogins
    value是相应的

    这里写图片描述

    最大进程数目


    LINUX中进程的最大理论数计算


    • 每个进程都要在全局段描述表GDT中占据两个表项

    每个进程的局部段描述表LDT都作为一个独立的段而存在,在全局段描述表GDT中要有一个表项指向这个段的起始地址,并说明该段的长度以及其他一些 参数。除上之外,每个进程还有一个TSS结构(任务状态段)也是一样。所以,每个进程都要在全局段描述表GDT中占据两个表项。

    • GDT的容量有多大呢?

    段寄存器中用作GDT表下标的位段宽度是13位,所以GDT中可以有 213=8192 个描述项。

    除一些系统的开销(例如GDT中的第2项和第3项分别用于内核 的代码段和数据段,第4项和第5项永远用于当前进程的代码段和数据段,第1项永远是0,等等)以外,尚有8180个表项可供使用,所以理论上系统中最大的 进程数量是 8180/2=4090

    所以系统中理论上最大的进程数是4090

    系统中可创建的进程数实际值


    linux内核通过进程标识值(process identification value)-PID来标示进程,PID是一个数,类型位pid_t, 实际上就是int类型

    为了与老版本的Unix或者Linux兼容,PID的最大值默认设置位32768(short int 短整型的最大值)。

    • 查看

    可以使用cat /proc/sys/kernel/pid_max来查看系统中可创建的进程数实际值

    cat /proc/sys/kernel/pid_max

    • 修改
    ulimit -u 65535

    设置完以后,虽然我们设置户创建进程数的硬限制和软限制都是65535,但是我们还不能使用创建65535个进程

    我们在Linux还需要设置内核参数kernel.pid_max,这个参数我默认安装都是32768,

    所以即使使用root帐户,却不设置这个内核参数,整个系统最多可以创建的进程数就是32768,所以我们需要进行如下设置:

    sysctl -w  kernel.pid_max=65535

    最大线程数


    linux 系统中单个进程的最大线程数有其最大的限制 PTHREAD_THREADS_MAX

    这个限制可以在/usr/include/bits/local_lim.h中查看
    对 linuxthreads 这个值一般是 1024,对于 nptl 则没有硬性的限制,仅仅受限于系统的资源

    这个系统的资源主要就是线程的 stack 所占用的内存,用 ulimit -s 可以查看默认的线程栈大小,一般情况下,这个值是8M=8192KB

    这里写图片描述

    可以写一段简单的代码验证最多可以创建多少个线程

    include <stdio.h>
    #include <stdlib.h>
    #include <pthread.h>
    
    void func()
    {
    }
    
    int main(void)
    {
        int i = 0;
        pthread_t thread;
    
        while ( 1 )
        {
            if (pthread_create(&thread, NULL, func, NULL) != 0)
            {
                return;
            }
    
            i++;
            printf("i = %d\n", i);
        }
    
        return EXIT_SUCCESS;
    }
    

    这里写图片描述

    试验显示,在我们的系统(Ubuntu-14.04-LTS-64bit)中linuxthreads 上最多可以创建 381 个线程,之后就会返回 EAGAIN

    LINUX中单个进程理论上可以创建的最大线程数


    而32位系统中,可以穿件381个线程,这个值和理论完全相符,因为 32 位 linux 下的进程用户空间是 3G 的大小,也就是 3072M,用 3072M/8M=384 ,但是实际上代码段和数据段等还要占用一些空间,这个值应该向下取整到 383,再减去主线程,得到 382。

    那为什么 linuxthreads 上还要少一个线程呢?这可太对了,因为 linuxthreads 还需要一个管理线程

    为了突破内存的限制,可以有两种方法

    • ulimit -s 1024减小默认的栈大小

    • 调用pthread_create的时候用pthread_attr_getstacksize设置一个较小的栈大小

    要注意的是,即使这样的也无法突破1024 个线程的硬限制,除非重新编译 C 库

    最大打开文件数


    file-max系统最大打开文件描述符数


    /proc/sys/fs/file-max中指定了系统范围内所有进程可打开的文件句柄的数量限制(系统级别, kernel-level).

    The value in file-max denotes the maximum number of file handles that the Linux kernel will allocate).

    当收到”Too many open files in system”这样的错误消息时, 就应该曾加这个值了.

    对于2.2的内核, 还需要考虑inode-max, 一般inode-max设置为file-max的4倍. 对于2.4及以后的内核, 没有inode-max这个文件了.

    查看实际值


    可以使用cat /proc/sys/fs/file-max来查看当前系统中单进程可打开的文件描述符数目
    186405
    这里写图片描述

    设置


    • 临时性

    echo 1000000 > /proc/sys/fs/file-max

    • 永久性:在/etc/sysctl.conf中设置

    fs.file-max = 1000000

    nr_open是单个进程可分配的最大文件数


    内核支持的最大file handle数量,即一个进程最多使用的file handle数

    the maximum number of files that can be opened by process。

    A process cannot use more than NR_OPEN file descriptors.
    一个进程不能使用超过NR_OPEN文件描述符。
    

    这里写图片描述

    nofile进程最大打开文件描述符数


    查看实际值


    ulimit -n

    这里写图片描述

    当然默认查看的是软资源限制值soft limit,如果想要查看系统硬件所能支持的单进程最大打开文件描述符号的数目,可以使用ulimit -Hn

    这里写图片描述

    设置


    • 临时性

    通过ulimit -Sn设置最大打开文件描述符数的soft limit,注意soft limit不能大于hard limit(ulimit -Hn可查看hard limit)

    另外ulimit -n默认查看的是soft limit,但是ulimit -n 1800000则是同时设置soft limit和hard limit。

    对于非root用户只能设置比原来小的hard limit。

    • 永久性

    上面的方法只是临时性的,注销重新登录就失效了,而且不能增大hard limit,只能在hard limit范围内修改soft limit。

    若要使修改永久有效,则需要在/etc/security/limits.conf中进行设置(需要root权限),可添加如下两行,表示用户chanon最大打开文件描述符数的soft limit为1800000,hard limit为2000000。以下设置需要注销之后重新登录才能生效:

    chanon           soft    nofile          102400
    chanon           hard   nofile          409600

    设置nofile的hard limit还有一点要注意的就是hard limit不能大于/proc/sys/fs/nr_open,假如hard limit大于nr_open,注销后无法正常登录。

    这里写图片描述

    可以修改nr_open的值:

    echo 2000000 > /proc/sys/fs/nr_open

    file-max, nr_open, onfile之间的关系


    针对用户打开最大文件数的限制, 在limits.conf对应的nofile,不管是man手册还是文件中说明都只是一句话

    “maximum number of open files”,

    它其实对应是单个进程能打开的最大文件数,通常为了省事,我们想取消它的限制

    根据man手册中,“values -1, unlimited or infinity indicating no limit”,-1、unlimited、infinity都是表明不做限制

    可是当你实际给nofile设置成这个值,等你重启就会发现无法登录系统了。

    由此可见,nofile是有一个上限的,同时用ulimit测试:

    ulimit -n unlimited

    bash: ulimit: open files: cannot modify limit: 不允许的操作

    这里写图片描述

    写一个简单的for循环得出:

    for  V in `seq  100000  10000000`;do ulimit -n $V;[[ $? != 0 ]]&&break;done

    再执行ulimit -n ,可以看到1048576就是nofile的最大值了,但为什么是这个值?

    10241024=1048576 ,当然这并没有什么卵用。

    再跟踪一下我们就会发现这个值其实是由内核参数nr_open定义的:

    cat /proc/sys/fs/nr_open 

    这里写图片描述

    到此我们就要说起nr_open,与file-max了,网上在说到设置最大文件数时偶尔有些帖子也说到要修改file-max,字面上看file-max确实像是对应最大文件数,而在linux内核文档中它们两的解释是:

    • file-max:
      The value in file-max denotes the maximum number of file-
      handles that the Linux kernel will allocate. When you get lots
      of error messages about running out of file handles, you might
      want to increase this limit

    执行:grep -r MemTotal /proc/meminfo | awk ‘{printf(“%d”,$2/10)}’,可以看到与file-max是相近的;

    这里写图片描述

    • nr_open:
      This denotes the maximum number of file-handles a process can
      allocate. Default value is 1024*1024 (1048576) which should be
      enough for most machines. Actual limit depends on RLIMIT_NOFILE
      resource limit.

    file-handles(即文件句柄),然后相比而言在UNIX/LINUX中我们接触更多是file discriptor(FD,即文件描述符),似乎file-handle在windows中是一个类似file discrptor的东东,但是我们讨论的是linux,再google一下,我们可以精确到c语言中这两个概念的区别,

    据他们的讨论file-handle应该是一个高层的对象,使用fopen,fread等函数来调用,而FD是底层的一个对象,可以通过open,read等函数来调用。

    到此,我们应该可以下一个大致的结论了,file-max是内核可分配的最大文件数,nr_open是单个进程可分配的最大文件数,所以在我们使用ulimit或limits.conf来设置时,如果要超过默认的1048576值时需要先增大nr_open值(sysctl -w fs.nr_open=100000000或者直接写入sysctl.conf文件)。当然百万级别的单进程最大file-handle打开数应该也够用了吧。。

    1. 所有进程打开的文件描述符数不能超过/proc/sys/fs/file-max

    2. 单个进程打开的文件描述符数不能超过user limit中nofile的soft limit

    3. nofile的soft limit不能超过其hard limit

    4. nofile的hard limit不能超过/proc/sys/fs/nr_open

    其他


    如下内容转载自

    linux 单进程可创建最大线程数

    2.4内核与2.6内核的主要区别


    在2.4内核的典型系统上(AS3/RH9),线程是用轻量进程实现的,每个线程要占用一个进程ID,在服务器程序上,如果遇到高点击率访问,会造成进程表溢出,系统为了维护溢出的进程表,会有间歇的暂停服务现象,而2.6内核就不会发生由于大量线程的创建和销毁导致进程表溢出的问题

    线程结束必须释放线程堆栈


    就是说,线程函数必须调用pthread_exit()结束,否则直到主进程函数退出才释放,特别是2.6内核环境,线程创建速度飞快,一不小心立刻内存被吃光,这一点反倒是2.4内核环境好,因为2.4内核创建的是进程,而且线程创建速度比2.6内核慢几个数量级。特别提醒,在64位CPU,2.6内核创建线程的速度更加疯狂,要是太快的话,加上usleep ()暂停一点点时间比较好

    不要编需要锁的线程应用


    只有那些不需要互斥量的程序才能最大限度的利用线程编程带来的好处,否则只会更慢,2.6内核是抢占式内核,线程间共享冲突发生的几率远比2.4内核环境高,尤其要注意线程安全,否则就算是单CPU也会发生莫名其妙的内存不同步(CPU的高速缓存和主存内容不一致),Intel的新CPU为了性能使用NUMA架构,在线程编程中一定要注意扬长避短。

    单进程服务器最大并发线程数与内存


    很有趣,在默认的ulimit参数下,不修改内核头文件
    AS3 512M内存最多1000并发持续连接
    CentOS4.3 512M内存最多300并发持续连接
    似乎是CentOS不如AS3,这里主要原因是ulimit的配置造成,两个系统默认的配置差距很大,要想单进程维持更多线程接收并发连接,就要尽量缩小 ulimit -s的参数,插更多的内存条,单进程服务器上2000并发一点都不难,POSIX默认的限制是每进程64线程,但NTPL并非纯正POSIX,不必理会这个限制,2.6内核下真正的限制是内存条的插槽数目(也许还有买内存的钱数)
    最近几天的编程中,注意到在32位x86平台上2.6内核单进程创建最大线程数=VIRT上限/stack,与总内存数关系不大,32位x86系统默认的VIRT上限是3G(内存分配的3G+1G方式),默认 stack大小是10240K,因此单进程创建线程默认上限也就300(3072M / 10240K),用ulimit -s 修改stack到1024K则使上限升到大约3050。我手头没有64位系统,不知道2.6内核在64位上单进程创建线程上限(实际上是本人懒得在同事的机器上装fc4_x86_64)。
    前些天买了一套廉价的64位x86系统(64位赛杨+杂牌915主板),安装了CentOS4.3的x86_64版本,跑了一遍下面的小程序,得到的结果是:在ulimit -s 4096的情况下,单进程最大线程数在16000多一点,用top看
    VIRT 的上限是64G,也就是36位, cat /proc/cpuinfo的结果是:address sizes : 36 bits physical, 48 bits virtual, 和我想象的标准64位系统不同, 我一直以为64位系统的内存空间也是64位的

    附注1


    单位里某BSD FANS用AMD64笔记本跑小程序测试线程创建速度(线程创建后立即phread_detach()然后紧跟着pthread_exit(),共计 100万个线程),同样源码OpenBSD竟然比FreeBSD快了3倍,什么时候OpenBSD也变得疯狂起来了?

    附注2


    测试单进程创建线程上限C源码(test.c)

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <pthread.h>
    
    void * thread_null(void);
    
    int main(int argc, char *argv[])
    {
        unsigned int    i;
        int             rc;
        pthread_t       pool_id[65536]; //线程ID
    
        sleep(1);
    
        //创建线程
        for(i = 0; i < 65536; i++)
        {
            rc = pthread_create(pool_id + i, 0, (void *)thread_null, NULL);
            if (rc != 0)
            {
                fprintf(stderr, "pthread_create() failure\r\nMax pthread num is %d\r\n", i);
                exit(-1);
            }
        }
    
        fprintf(stdout, "Max pthread num is 65536\r\nYour system is power_full\r\n");
    
        exit(0);
    }
    void * thread_null(void)
    {
        pthread_detach(pthread_self());
        sleep(60);
        pthread_exit(NULL);
    }

    参考

    linux参数之/proc/sys/fs详解

    展开全文
  • Pycharm出现out of memory 的终极解决方法

    万次阅读 多人点赞 2019-05-08 11:42:47
    Pycharm出现out of ...最近在跑程序,然后Pycharm就跳出out of memory 的错误提示,可能是由于读取的数据太多导致的,Pycharm有一个默认内存的最大容量上线,跳出提示的是1024M,也就是分配给Pycharm的内内存不...
  • GlusterFS集群文件系统研究

    万次阅读 热门讨论 2011-03-28 21:01:00
    GlusterFS是Scale-Out存储解决方案Gluster的核心,它是一个开源的分布式文件系统,具有强大的横向扩展能力,通过扩展能够支持数PB存储容量和处理数千客户端。GlusterFS借助TCP/IP或InfiniBand RDMA网络将物理分布的...
  • 磁盘容量配额

    千次阅读 2018-05-18 17:36:02
      本书在前面曾经讲到,Linux 系统的设计...针对这种情况,root 管理员就需要使用磁盘容量配额服务来限制某位用户或某个用户组针对特定文件夹可以使用的最大硬盘空间或最大文件个数,一旦达到这个最大值就不再允许...
  • 修改linux系统的最大打开文件

    千次阅读 2014-03-31 13:30:01
     所以,如果有上述问题存在,就只能去打开/etc/profile脚本文件,在文件中查找是否使用了ulimit-n限制了用户可同时打开的最大文件数量,如果找到,则删除这行命令,或者将其设置的值改为合适的值,然后保存文件,...
  • 既然我们知道各个内存区域存储的内容,那么只要在代码上做一些手脚,就可以制造出OutOfMemory异常,这就是我们这一讲要做的事。
  • 写在前面 前面我们学习了如何基于两台服务器搭建...FastDFS 是一个开源的分布式文件系统,它对文件进行管理,功能包括:文件存储、文件同步、文件访问(文件上传、文件下载)等,解决了大容量存储和负载均衡的问题。特
  • 今天遇到个怪问题,同事反应部署tomcat的分区/app无法上传文件,无论是用lrzsz还是xshell附属的xftp均无法上传文件到指定位置,经检查目录权限均允许写入,然后查看系统分区空间大小发现空间已满,如下图(请忽略下面...
  • 深入理解JVM:OutOfMemory实战

    千次阅读 2015-08-13 18:24:11
    Java堆用于存储对象实例,只要不断的创建对象,并且保证GC Roots到对象之间有可达路径来避免垃圾回收机制来清除这些对象,那么对象数量到达最大容量限制后就会产生内存溢出异常。例如:// VM Args:-Xms20m -Xmx20m...
  • 按照Oracle文档的描述,每个datafile的最大容量为(2^22-1)个block,即4194303个block。下面列表说明不同数据块数据库所能支持的最大物理文件大小: 数据块的大小 物理文件的最大值 M ===========================...
  • 一、什么是Lustre文件系统Lustre是HP, Intel,Cluster FileSystem公司联合美国能源部开发的Linux集群并行文件系统。该系统目前推出 1.0 的发布版本,是第一个基于对象存储设备的,开源的并行文件系统。其结构如图所...
  • Redis_conf配置文件说明

    万次阅读 2015-07-10 17:24:18
    1. # Redis示例配置文件  2.  3. # 注意单位问题:当需要设置内存大小的时候,可以使用类似1k、5GB、4M这样的常见格式:  4. #  5. # 1k => 1000 bytes  6. # 1kb => 1024 bytes  7. # 1m =...
  • 分布式文件系统 FastDFS 5.0.5 & Linux CentOS 7 安装配置

    万次阅读 多人点赞 2016-09-26 09:27:09
    关于分布式文件系统FastDFS在Linux CentOS 7下的安装部署与测试~
  • c++文件操作大全

    万次阅读 多人点赞 2019-01-17 15:43:06
    c++文件操作大全 基于C的文件操作  在ANSI C中,对文件的操作分为两种方式,即流式文件操作和I/O文件操作,下面就分别介绍之。 一、流式文件操作 这种方式的文件操作有一个重要的结构FILE,FILE在stdio.h中定义...
  • 横向扩展(Scale-Out)存储

    万次阅读 2011-03-25 21:23:00
    横向扩展(Scale-Out)存储有助于构建这一全新模式,通过创建存储核心架构来应对非结构化数据激增带来的巨大挑战。横向扩展存储的经济价值体现在改进扩展能力、加速配置、提升性能和简化管理、提高存储利用率等方面...
  • 搭建FastDFS文件上传服务器

    万次阅读 多人点赞 2018-07-27 17:34:57
    一、FastDFS介绍 ...参考:分布式文件系统FastDFS设计原理 参考:FastDFS分布式文件... 它的主要功能包括:文件存储,文件同步和文件访问,以及高容量和负载平衡。主要解决了海量数据存储问题,特别适合以中小文件(...
  • 提到java,我们可能第一时间想起的就是那句口号,“一次编写,到处运行”,这体现了java与平台无关的优势,而实现这种特性的的基础,是通过将java编译成字节码文件,虚拟机可以载入和执行同一种平台无关的字节码,...
  • 【Java】Java实现批量打包文件Zip下载

    千次阅读 2017-05-19 16:18:34
    有这样一个需求,需要将某个文件夹进行下载,而且该文件下包含多张图片,图片是存储于Linux服务器上的。故采用zip打包方式进行下载。在此并没有采用获取网络图片的方式进行下载,而是找到图片在服务器上存储路径进行...
  • 多种嵌入式文件系统移植集合

    万次阅读 2013-06-01 21:23:34
    闪存的容量比较大,最大容量己达到 8G 字节 . 为了方便管理, NandFlash 的存储空间使用了块和页两级存储体系,也就是说它的存储空间是二维的,比如 K9F5608UOA 闪存块的大小为 16K ,每页大小是 512 字节,每页还 ...
  • 系统扩展方式 scale up和scale out

    万次阅读 2018-09-20 18:06:37
    升级存储系统最常见的原因是需要更多的容量,以支持更多的用户,文件,应用程序或连接的服务器。  但是通常,存储系统的升级不只是需要容量,系统还对其他存储资源有额外需求,即带宽和计算能力。如果没有足够的I/...
  • Web版PACS开发纪要二:DCM文件的网络传输 ——解决文件传输数据“丢失”问题 目录 背景介绍 问题搜索 问题分析 问题解决 0背景介绍 该工程是上个月博文的延续。在利用“完成端口”完成了文件自动归档...
  • centos6构建XFS文件系统

    千次阅读 2016-09-28 09:27:57
    在CENTOS6上面,需要安装mysql数据库,为提高数据库的读写效率和性能,准备将mysql数据文件系统安装在XFS分区上。  XFS,一种高性能的日志文件系统,最早于1993年,由Silicon Graphics为他们的IRIX操作系统而...
  • JVM--Class类文件结构(一)

    千次阅读 2017-10-20 23:50:16
    我想有不在少数的C程序员在学习Java之后在认知上会粗略的认为C程序在经过编译后产生的.out文件与.class文件在各方面大概相同,我刚开始也这样迷惑自己,但是随着学习的深入,我们必须搞清楚.class文件到底是个什么...
  • UBIFS文件系统介绍

    千次阅读 2013-10-12 14:50:14
    在了解UBIFS之前一定要注意UBIFS和任何传统的文件系统是不一样的:UBIFS不是运行在block device之上的(比如hard disk, MMC/SD卡,USB flash驱动等等)。UBIFS是运行于raw flash之上。请在开始UBIFS之旅前确保理解...
  • 可将来巨大的catalina.out文件直接删除,也可采用cp /dev/null catalina.out文件,将空间覆盖此文件。 启动tomcat,查看TOMCAT_HOME/logs下面是否生成了当前日期的out.log文件,观看几天看能否运行正常。   ...
  • 一些git网络库的容量限制

    千次阅读 2018-07-13 09:52:47
    一个仓库容量1G,单个文件不能超过100Mhttps://help.github....

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 71,063
精华内容 28,425
关键字:

out文件最大容量