Linux架构的多线程相比Windows,BSD在性能上有差距

林希 发布于 2015/01/11 19:11
阅读 1K+
收藏 0

相同的硬件,在尽可能去除其它影响因素的情况下,数据显示Linux架构的多线程比Windows和BSD在性能上有差距,没有深入探究。

请内核开发经验丰富的朋友给点解释和指导。


谢谢

加载中
2
mickelfeng
mickelfeng

linux下的线程和其他平台的线程有些许不同,它需要一个外部库的支持才可以例如pthread,并且实际上linux下没有独立的明显的线程概念,现在其所谓的线程实际上也是进程。  

不是真正意义上的线程,实际上都是进程。

http://www.ibm.com/developerworks/cn/linux/l-cn-mthreadps/

1
eechen
eechen
@mickelfeng LinuxThreads是2.6内核之前的老古董,现在都是NPTL(Native Posix Thread Library),也就是常说的 pthreads. ldd `which mysqld` 可见其依赖共享库libpthread.so.0. 在Linux 2.6.x出现的NPTL(Native Posix Thread Library)使用内核的新特性重写了Linux的线程库, 取代历史悠久而备受争议的LinuxThreads成为glibc的首选线程库,Linux上的线程性能得到了大幅提升. 详细对比请看: http://www.ibm.com/developerworks/cn/linux/l-threading.html

A simple "benchmark" for fork/pthread_create
berlin.ccc.de/~packet/fork_test.c
gcc -Wall -Werror -D_REENTRANT -Os -static -o fork_test fork_test.c -lrt -lpthread

Ubuntu14.04/i5-3230M上的运行结果:


以fork为100,三者消耗的时间比为:
fork : vfork : pthread_create = 100 : 46 : 20
0
旁边白
旁边白
这样的问题是该上github上咨询内核开发者的,最好还是自己研究
0
Windoze
Windoze

问的是Linux、Windows、BSD,下面打了一个VxWorks的标签,题主这是想闹那样?

此号作废
此号作废
风河linux ^_^~
0
eechen
eechen
Linux上的多线程应用一般都会动态链接共享库libpthread.so.0,执行ldd program可见.
file /lib/x86_64-linux-gnu/libpthread-2.19.so
线程库的头文件:
/usr/include/pthread.h
线程库使用说明:
http://man7.org/linux/man-pages/man7/pthreads.7.html
http://man7.org/linux/man-pages/man3/pthread_create.3.html

欢迎你在装了双系统的机器下在Windows和Linux上进行如下测试:
Web服务测试: Apache Event MPM vs Apache WinNT MPM
Java应用服务器测试: Java Tomcat
数据库测试: MySQL InnoDB
看看Linux上的多线程的性能是不是真的像你说的那样比Windows上差.

另外,Firefox/Chrome/Flash/VirtualBox,这些则是我常接触的Linux图形化的多线程应用.下图是Linux上Firefox的线程情况:

林希
林希
谢谢你提供的信息,你说的是线程运行时的性能,不知道你有没有考虑线程创建的情况呢?就是说在快速创建线程时对于系统的资源占用的情况,比如内存,CPU调度时间。
0
yak
yak
java的多线程是最强大的,同样的硬件机器装个双系统, 装同样版本的tomcat 然后在内网其他机器上用同样的ab或者httpref 跑一下,就知道了
0
eechen
eechen

引用来自“mickelfeng”的评论

linux下的线程和其他平台的线程有些许不同,它需要一个外部库的支持才可以例如pthread,并且实际上linux下没有独立的明显的线程概念,现在其所谓的线程实际上也是进程。  

不是真正意义上的线程,实际上都是进程。

http://www.ibm.com/developerworks/cn/linux/l-cn-mthreadps/

请教:那什么才是真正意义上的线程?
MySQL是多线程应用:
ps -efL|head -n1 && ps -efL|grep mysqld
UID        PID  PPID   LWP  C NLWP STIME TTY          TIME CMD
mysql     9333     1  9333  1   6 13:30 ?        00:00:00 /usr/sbin/mysqld
mysql     9333     1  9345  0   6 13:30 ?        00:00:00 /usr/sbin/mysqld
mysql     9333     1  9346  0   6 13:30 ?        00:00:00 /usr/sbin/mysqld
mysql     9333     1  9347  0   6 13:30 ?        00:00:00 /usr/sbin/mysqld
mysql     9333     1  9348  0   6 13:30 ?        00:00:00 /usr/sbin/mysqld
mysql     9333     1  9348  0   6 13:30 ?        00:00:00 /usr/sbin/mysqld
NLWP表示线程组中线程的个数.主线程的PID号等于自身的线程编号LWP.所有线程的PID都是一样的,内存占用对外显示都是相同的大小.

PHP-FPM是多进程应用:
ps -efL|head -n1 && ps -efL|grep php-fpm
UID        PID  PPID   LWP  C NLWP STIME TTY          TIME CMD
root      9495  1385  9495  0    1 13:35 ?        00:00:00 php-fpm: master process                                                                  
png       9496  9495  9496  0    1 13:35 ?        00:00:00 php-fpm: pool www                                                                                                               
png       9497  9495  9497  0    1 13:35 ?        00:00:00 php-fpm: pool www                                                                                                               
png       9498  9495  9498  0    1 13:35 ?        00:00:00 php-fpm: pool www
每个进程的PID都不同,3个worker进程的父进程号PPID是master进程的PID,内存占用对外会各有相同.



Linux上线程和进程用ps/top工具查看都有明显的差别,你怎么会说Linux下没有独立的明显的线程概念.
0
k
kchr

从 2004 年 8 月发布的 glibc 2.3.3 算起,nptl 线程上位,linuxthread 废弃差不多 10 年了。

http://lists.gnu.org/archive/html/info-gnu/2004-08/msg00002.html

目前 linux 的 thread 是在内核实现的,nptl 是对内核调用的一个包装。

0
此号作废
此号作废

代码先发出来啊

可以看下《unix编程艺术》上对linux线程的经典评论。

-2
mickelfeng
mickelfeng

进程与线程之间是有区别的,不过Linux内核只提供了轻量进程的支持,未实现线程模型。Linux是一种“多进程单线程”的操作系统。Linux本身只有进程的概念,而其所谓的“线程”本质上在内核里仍然是进程。

     大家知道,进程是资源分配的单位,同一进程中的多个线程共享该进程的资源(如作为共享内存的全局变量)。Linux中所谓的“线程”只是在被创建时clone了父进程的资源,因此clone出来的进程表现为“线程”,这一点一定要弄清楚。因此,Linux“线程”这个概念只有在打冒号的情况下才是最准确的。

     目前Linux中最流行的线程机制为LinuxThreads,所采用的就是线程-进程“一对一”模型,调度交给核心,而在用户级实现一个包括信号处理在内的线程管理机制。LinuxThreads由Xavier Leroy (Xavier.Leroy@inria.fr)负责开发完成,并已绑定在GLIBC中发行,它实现了一种BiCapitalized面向Linux的Posix 1003.1c “pthread”标准接口。Linuxthread可以支持Intel、Alpha、MIPS等平台上的多处理器系统。 

mysql里面的代码,还是通过pthread来实现的线程

./libmysql/my_thr_init.c:  return my_thread_var->id;
./libmysql/my_thr_init.c:const char *my_thread_name(void)
./libmysql/my_thr_init.c:const char *my_thread_name(void)
./libmysql/my_thr_init.c:  struct st_my_thread_var *tmp=my_thread_var;
./libmysql/my_thr_init.c:    my_thread_id id= my_thread_dbug_id();
./libmysql/my_thr_init.c:    strmake(tmp->name,name_buff,THREAD_NAME_SIZE);
./libmysql/my_thr_init.c:static uint get_thread_lib(void)
./libmysql/my_thr_init.c:#ifdef _CS_GNU_LIBPTHREAD_VERSION
./libmysql/my_thr_init.c:  confstr(_CS_GNU_LIBPTHREAD_VERSION, buff, sizeof(buff));
./libmysql/my_thr_init.c:  if (!strncasecmp(buff, "linuxthreads", 12))
./libmysql/my_thr_init.c:#endif /* THREAD */
./pstack/linuxthreads.c: * LinuxThreads specific stuff.
./pstack/linuxthreads.c:#include        <limits.h>      /* PTHREAD_THREADS_MAX */
./pstack/linuxthreads.c:#include        <pthread.h>
./pstack/linuxthreads.c:#include        "linuxthreads.h"
./pstack/linuxthreads.c: * Internal LinuxThreads variables.
./pstack/linuxthreads.c:extern volatile int             __pthread_threads_debug;
./pstack/linuxthreads.c:extern volatile char            __pthread_handles;
./pstack/linuxthreads.c:extern char                     __pthread_initial_thread;
./pstack/linuxthreads.c:/*extern volatile       Elf32_Sym*      __pthread_manager_thread;*/
./pstack/linuxthreads.c:extern const int                __pthread_sizeof_handle;
./pstack/linuxthreads.c:extern const int                __pthread_offsetof_descr;
./pstack/linuxthreads.c:extern const int                __pthread_offsetof_pid;
./pstack/linuxthreads.c:extern volatile int             __pthread_handles_num;
PYPlus
PYPlus
回复 @PYPlus : 我好像错了
PYPlus
PYPlus
你错了 linux内核有实现线程. ntpl. linuxThread早就被ntpl替代了
返回顶部
顶部