Chinaunix首页 | 论坛 | 博客
  • 博客访问: 516093
  • 博文数量: 118
  • 博客积分: 10028
  • 博客等级: 上将
  • 技术积分: 1820
  • 用 户 组: 普通用户
  • 注册时间: 2007-11-07 18:46
文章分类

全部博文(118)

文章存档

2009年(12)

2008年(106)

我的朋友

分类: C/C++

2008-08-21 17:25:57

一、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源码
#include
#include
#include
#include
#include

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 (0 != rc) {
            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);
}
阅读(1309) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2010-09-05 17:32:05

OpenBSD 才比FreeBSD快3倍?那说明FreeBSD非常快。 OpenBSD是用户级的模拟线程,而FreeBSD是内核级线程,FreeBSD创建线程要系统调用,而OpenBSD仅仅是库函数,但是两者在实际环境中,FreeBSD将胜出。