LINUX.ORG.RU
ФорумAdmin

Сравнение производительности php: FreeBSD vs Gentoo Linux

 


7

8

Доброго времени суток,

Имеется два идентичных сервера: Xeon E3-1270v2, 32Gb RAM, RAID10. На одном из них стоит Gentoo Linux запиленная под железо, на другом FreeBSD 10-STABLE. Стало интересно сравнить производительность фри c Linux-ом на типичных серверных задачах: nginx+uwsgi_php55, mariadb-galera, redis. Все кроме php работает замечательно. По результатам теста, php под FreeBSD жрет на 30% больше проца и при этом существенно проигрывает в скорости по сравнению с Linux-ом. Сразу скажу, что на обеих ОСях php собран одной версией компилятора, одинаковыми модулями и с теми же CFLAGS. Прослойка uwsgi никакого влияния не оказывает, пробовал php-fpm - результат тот же. В сетевом стеке или nginx затыка тоже нет (настройки nginx одинаковые). Для уверенности в этом, результат выполнения скрипта клал в htm файл и тащил по сети в 16 потоков, трафик забил гигобитный линк до отказа. Скорость отдачи статики через nginx практически одинаковые на обеих серверах. В итоге получилось, что на Linux php скрипт (банальный phpinfo()) выполнился за 1 msec, а на фре примерно за 8 msec. Ниже трейсы с временными метками.

Gentoo Linux:

12:46:32.578393 accept4(6, {sa_family=AF_INET, sin_port=htons(59528), sin_addr=inet_addr("192.168.3.7")}, [16], SOCK_NONBLOCK) = 10
12:46:32.578527 read(10, "\0167\2\0\17\0SCRIPT_FILENAME+\0/home/htt"..., 4100) = 574
12:46:32.578678 lstat("/home", {st_mode=S_IFDIR|0755, st_size=256, ...}) = 0
12:46:32.578779 lstat("/home/httpd", {st_mode=S_IFDIR|0755, st_size=80, ...}) = 0
12:46:32.578917 lstat("/home/httpd/www", {st_mode=S_IFDIR|0755, st_size=120, ...}) = 0
12:46:32.578966 lstat("/home/httpd/www/system", {st_mode=S_IFDIR|0755, st_size=208, ...}) = 0
12:46:32.579035 lstat("/home/httpd/www/system/web", {st_mode=S_IFDIR|0755, st_size=440, ...}) = 0
12:46:32.579078 stat("/home/httpd/www/system/web", {st_mode=S_IFDIR|0755, st_size=440, ...}) = 0
12:46:32.579124 lstat("/home", {st_mode=S_IFDIR|0755, st_size=256, ...}) = 0
12:46:32.579161 lstat("/home/httpd", {st_mode=S_IFDIR|0755, st_size=80, ...}) = 0
12:46:32.579177 lstat("/home/httpd/www", {st_mode=S_IFDIR|0755, st_size=120, ...}) = 0
12:46:32.579225 lstat("/home/httpd/www/system", {st_mode=S_IFDIR|0755, st_size=208, ...}) = 0
12:46:32.579261 lstat("/home/httpd/www/system/web", {st_mode=S_IFDIR|0755, st_size=440, ...}) = 0
12:46:32.579296 lstat("/home/httpd/www/system/web/info.php", {st_mode=S_IFREG|0644, st_size=20, ...}) = 0
12:46:32.579321 stat("/home/httpd/www/system/web/info.php", {st_mode=S_IFREG|0644, st_size=20, ...}) = 0
12:46:32.579373 setitimer(ITIMER_PROF, {it_interval={0, 0}, it_value={60, 0}}, NULL) = 0
12:46:32.579417 rt_sigaction(SIGPROF, {0x7f67b9b1a0b0, [PROF], SA_RESTORER|SA_RESTART, 0x3654634d10}, {0x7f67b9b1a0b0, [PROF], SA_RESTORER|SA_RESTART, 0x3654634d10}, 8) = 0
12:46:32.579464 rt_sigprocmask(SIG_UNBLOCK, [PROF], NULL, 8) = 0
12:46:32.579517 lstat("/home/httpd/www/system/web", {st_mode=S_IFDIR|0755, st_size=440, ...}) = 0
12:46:32.579535 lstat("/home/httpd/www/system", {st_mode=S_IFDIR|0755, st_size=208, ...}) = 0
12:46:32.579565 lstat("/home/httpd/www", {st_mode=S_IFDIR|0755, st_size=120, ...}) = 0
12:46:32.579588 lstat("/home/httpd", {st_mode=S_IFDIR|0755, st_size=80, ...}) = 0
12:46:32.579608 lstat("/home", {st_mode=S_IFDIR|0755, st_size=256, ...}) = 0
12:46:32.579627 stat("/home/httpd/www/system/web", {st_mode=S_IFDIR|0755, st_size=440, ...}) = 0
12:46:32.579647 setitimer(ITIMER_PROF, {it_interval={0, 0}, it_value={30, 0}}, NULL) = 0
12:46:32.579662 lstat("/home/httpd/www/system/web/info.php", {st_mode=S_IFREG|0644, st_size=20, ...}) = 0
12:46:32.579679 lstat("/home/httpd/www/system/web", {st_mode=S_IFDIR|0755, st_size=440, ...}) = 0
12:46:32.579698 lstat("/home/httpd/www/system", {st_mode=S_IFDIR|0755, st_size=208, ...}) = 0
12:46:32.579715 lstat("/home/httpd/www", {st_mode=S_IFDIR|0755, st_size=120, ...}) = 0
12:46:32.579731 lstat("/home/httpd", {st_mode=S_IFDIR|0755, st_size=80, ...}) = 0
12:46:32.579772 lstat("/home", {st_mode=S_IFDIR|0755, st_size=256, ...}) = 0
12:46:32.579800 stat("/home/httpd/www/system/web/info.php", {st_mode=S_IFREG|0644, st_size=20, ...}) = 0
12:46:32.579816 lstat("/home/httpd/www/system/web/info.php", {st_mode=S_IFREG|0644, st_size=20, ...}) = 0
12:46:32.579831 lstat("/home/httpd/www/system/web", {st_mode=S_IFDIR|0755, st_size=440, ...}) = 0
12:46:32.579864 lstat("/home/httpd/www/system", {st_mode=S_IFDIR|0755, st_size=208, ...}) = 0
12:46:32.579882 lstat("/home/httpd/www", {st_mode=S_IFDIR|0755, st_size=120, ...}) = 0
12:46:32.579899 lstat("/home/httpd", {st_mode=S_IFDIR|0755, st_size=80, ...}) = 0
12:46:32.579917 lstat("/home", {st_mode=S_IFDIR|0755, st_size=256, ...}) = 0
12:46:32.579944 uname({sys="Linux", node="node1", ...}) = 0
12:46:32.581114 write(10, "HTTP/1.1 200 OK\r\nContent-type: t"..., 44) = 44
12:46:32.581141 write(10, "<!DOCTYPE html PUBLIC \"-//W3C//D"..., 95544) = 95544
12:46:32.581178 lstat("/home/httpd/www/system", {st_mode=S_IFDIR|0755, st_size=208, ...}) = 0
12:46:32.581195 lstat("/home/httpd/www", {st_mode=S_IFDIR|0755, st_size=120, ...}) = 0
12:46:32.581213 lstat("/home/httpd", {st_mode=S_IFDIR|0755, st_size=80, ...}) = 0
12:46:32.581232 lstat("/home", {st_mode=S_IFDIR|0755, st_size=256, ...}) = 0
12:46:32.581249 stat("/home/httpd/www/system", {st_mode=S_IFDIR|0755, st_size=208, ...}) = 0
12:46:32.581268 setitimer(ITIMER_PROF, {it_interval={0, 0}, it_value={0, 0}}, NULL) = 0
12:46:32.581298 setitimer(ITIMER_PROF, {it_interval={0, 0}, it_value={0, 0}}, NULL) = 0
12:46:32.581313 open("/proc/self/stat", O_RDONLY) = 13
12:46:32.581333 fstat(13, {st_mode=S_IFREG|0444, st_size=0, ...}) = 0
12:46:32.581369 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f67b87bf000
12:46:32.581390 read(13, "5295 (uwsgi) R 5292 5291 5291 0 "..., 1024) = 309
12:46:32.581415 close(13)               = 0
12:46:32.581435 munmap(0x7f67b87bf000, 4096) = 0
12:46:32.581452 close(10)               = 0
12:46:32.581475 writev(2, [{"{address space usage: 313401344 "..., 78}, {"[pid: 5295|app: -1|req: -1/20] 1"..., 207}], 2) = 285
12:46:32.581516 epoll_wait(8, ^CProcess 5295 detached
 <detached ...>

FreeBSD:

13518: 4.569934535 4.569699769 kevent(7,0x0,0,{0x6,EVFILT_READ,0x0,0,0x1,0x0},1,0x0) = 1 (0x1)
13518: 4.570825352 0.000052122 accept(6,{ AF_INET 192.168.3.8:27225 },0x800751104) = 9 (0x9)
13518: 4.571227700 0.000080451 read(9,"\^N7\^B\0\^O\0SCRIPT_FILENAME+\0"...,4100) = 574 (0x23e)
13518: 4.572505836 0.000127551 lstat("/home",{ mode=drwxr-xr-x ,inode=4,size=6,blksize=4096 }) = 0 (0x0)
13518: 4.572865713 0.000085512 lstat("/home/httpd",{ mode=drwxr-xr-x ,inode=8,size=3,blksize=4096 }) = 0 (0x0)
13518: 4.573190386 0.000084730 lstat("/home/httpd/www",{ mode=drwxr-xr-x ,inode=11,size=7,blksize=4096 }) = 0 (0x0)
13518: 4.573510820 0.000085387 lstat("/home/httpd/www/system",{ mode=drwxr-xr-x ,inode=14,size=8,blksize=4096 }) = 0 (0x0)
13518: 4.573830457 0.000086490 lstat("/home/httpd/www/system/web",{ mode=drwxr-xr-x ,inode=110568,size=15,blksize=4096 }) = 0 (0x0)
13518: 4.574463050 0.000112191 stat("/home/httpd/www/system/web",{ mode=drwxr-xr-x ,inode=110568,size=15,blksize=4096 }) = 0 (0x0)
13518: 4.574776573 0.000074341 lstat("/home",{ mode=drwxr-xr-x ,inode=4,size=6,blksize=4096 }) = 0 (0x0)
13518: 4.575283320 0.000147897 lstat("/home/httpd",{ mode=drwxr-xr-x ,inode=8,size=3,blksize=4096 }) = 0 (0x0)
13518: 4.575610283 0.000083883 lstat("/home/httpd/www",{ mode=drwxr-xr-x ,inode=11,size=7,blksize=4096 }) = 0 (0x0)
13518: 4.575931248 0.000084239 lstat("/home/httpd/www/system",{ mode=drwxr-xr-x ,inode=14,size=8,blksize=4096 }) = 0 (0x0)
13518: 4.576285572 0.000108849 lstat("/home/httpd/www/system/web",{ mode=drwxr-xr-x ,inode=110568,size=15,blksize=4096 }) = 0 (0x0)
13518: 4.576609324 0.000111585 lstat("/home/httpd/www/system/web/info.php",{ mode=-rw-r--r-- ,inode=102419,size=20,blksize=4096 }) = 0 (0x0)
13518: 4.576934252 0.000087095 stat("/home/httpd/www/system/web/info.php",{ mode=-rw-r--r-- ,inode=102419,size=20,blksize=4096 }) = 0 (0x0)
13518: 4.578137551 0.000044300 setitimer(2,{0.000000, 60.000000 },0x0) = 0 (0x0)
13518: 4.578890119 0.000065843 sigprocmask(SIG_SETMASK,SIGHUP|SIGINT|SIGQUIT|SIGILL|SIGTRAP|SIGABRT|SIGEMT|SIGFPE|SIGKILL|SIGBUS|SIGSEGV|SIGSYS|SIGPIPE|SIGALRM|SIGTERM|SIGURG|SIGSTOP|SIGTSTP|SIGCONT|SIGCHLD|SIGTTIN|SIGTTOU|SIGIO|SIGXCPU|SIGXFSZ|SIGVTALRM|SIGPROF|SIGWINCH|SIGINFO|SIGUSR1|SIGUSR2,0x0) = 0 (0x0)
13518: 4.579187695 0.000043938 sigaction(SIGPROF,{ 0x8008c4f10 SA_RESTART|SA_SIGINFO ss_t },{ SIG_DFL SA_RESTART ss_t }) = 0 (0x0)
13518: 4.579462247 0.000041825 sigprocmask(SIG_SETMASK,0x0,0x0) = 0 (0x0)
13518: 4.579911068 0.000042550 sigprocmask(SIG_UNBLOCK,SIGPROF,0x0) = 0 (0x0)
13518: 4.590744228 0.000042902 getpid()		 = 13518 (0x34ce)
13518: 4.591336110 0.000120646 lstat("/home/httpd/www/system/web",{ mode=drwxr-xr-x ,inode=110568,size=15,blksize=4096 }) = 0 (0x0)
13518: 4.591654258 0.000083637 lstat("/home/httpd/www/system",{ mode=drwxr-xr-x ,inode=14,size=8,blksize=4096 }) = 0 (0x0)
13518: 4.591972362 0.000081378 lstat("/home/httpd/www",{ mode=drwxr-xr-x ,inode=11,size=7,blksize=4096 }) = 0 (0x0)
13518: 4.592261019 0.000077203 lstat("/home/httpd",{ mode=drwxr-xr-x ,inode=8,size=3,blksize=4096 }) = 0 (0x0)
13518: 4.592546414 0.000053455 lstat("/home",{ mode=drwxr-xr-x ,inode=4,size=6,blksize=4096 }) = 0 (0x0)
13518: 4.593027172 0.000087156 stat("/home/httpd/www/system/web",{ mode=drwxr-xr-x ,inode=110568,size=15,blksize=4096 }) = 0 (0x0)
13518: 4.593343938 0.000042315 setitimer(2,{0.000000, 30.000000 },0x0) = 0 (0x0)
13518: 4.593741569 0.000111314 lstat("/home/httpd/www/system/web/info.php",{ mode=-rw-r--r-- ,inode=102419,size=20,blksize=4096 }) = 0 (0x0)
13518: 4.594713138 0.000122570 open("/home/httpd/www/system/web/info.php",O_RDONLY,00) = 11 (0xb)
13518: 4.595143348 0.000071575 fstat(11,{ mode=-rw-r--r-- ,inode=102419,size=20,blksize=4096 }) = 0 (0x0)
13518: 4.595421016 0.000066014 lseek(11,0x0,SEEK_CUR) = 0 (0x0)
13518: 4.595870293 0.000074647 read(11,"<?php\nphpinfo();\n?>\n",8192) = 20 (0x14)
13518: 4.596238890 0.000046159 read(11,0x7dc8e8,8192) = 0 (0x0)
13518: 4.596512268 0.000044300 read(11,0x7dc8e8,8192) = 0 (0x0)
13518: 4.596948686 0.000071119 close(11)	 = 0 (0x0)
13518: 4.600002706 0.000046740 break(0xd44000)	 = 0 (0x0)
13518: 4.604407899 0.000144809 open("/home/httpd/www/system/web/info.php",O_RDONLY,00) = 11 (0xb)
13518: 4.604657610 0.000047382 fstat(11,{ mode=-rw-r--r-- ,inode=102419,size=20,blksize=4096 }) = 0 (0x0)
13518: 4.604905881 0.000046504 __sysctl(0x7fffffffb380,0x2,0x7fffffffb37c,0x7fffffffb388,0x0,0x0) = 0 (0x0)
13518: 4.605218127 0.000046154 fstat(11,{ mode=-rw-r--r-- ,inode=102419,size=20,blksize=4096 }) = 0 (0x0)
13518: 4.605494952 0.000044314 fstat(11,{ mode=-rw-r--r-- ,inode=102419,size=20,blksize=4096 }) = 0 (0x0)
13518: 4.605771958 0.000076125 mmap(0x0,20,PROT_READ,MAP_SHARED,11,0x0) = 34367475712 (0x800761000)
13518: 4.607110165 0.000039308 getpid()		 = 13518 (0x34ce)
13518: 4.609585731 0.000076692 munmap(0x800761000,20) = 0 (0x0)
13518: 4.609831733 0.000072562 close(11)	 = 0 (0x0)
13518: 4.610278029 0.000047472 __sysctl(0x7fffffffbfe0,0x2,0x7fffffffc130,0x7fffffffbfd8,0x0,0x0) = 0 (0x0)
13518: 4.610554860 0.000044264 __sysctl(0x7fffffffbfe0,0x2,0x7fffffffc230,0x7fffffffbfd8,0x0,0x0) = 0 (0x0)
13518: 4.610830052 0.000066649 __sysctl(0x7fffffffbfe0,0x2,0x7fffffffc330,0x7fffffffbfd8,0x0,0x0) = 0 (0x0)
13518: 4.611107379 0.000067807 __sysctl(0x7fffffffbfe0,0x2,0x7fffffffc430,0x7fffffffbfd8,0x0,0x0) = 0 (0x0)
13518: 4.611396603 0.000042516 __sysctl(0x7fffffffbfe0,0x2,0x7fffffffc530,0x7fffffffbfd8,0x0,0x0) = 0 (0x0)
13518: 4.616492616 0.000155860 open("/usr/share/locale/en_US.UTF-8/LC_CTYPE",O_CLOEXEC,0666) = 11 (0xb)
13518: 4.616764816 0.000070753 fstat(11,{ mode=-r--r--r-- ,inode=132288,size=76132,blksize=65536 }) = 0 (0x0)
13518: 4.617088612 0.000069731 fstat(11,{ mode=-r--r--r-- ,inode=132288,size=76132,blksize=65536 }) = 0 (0x0)
13518: 4.617405293 0.000064435 lseek(11,0x0,SEEK_CUR) = 0 (0x0)
13518: 4.617650067 0.000043323 lseek(11,0x0,SEEK_SET) = 0 (0x0)
13518: 4.618217554 0.000365490 read(11,"RuneMag1UTF-8\0\0\0\0\0\0\0\0\0"...,65536) = 65536 (0x10000)
13518: 4.619179546 0.000082154 read(11,"@\^D\b\0@\^D\b\0@\^D\b\0@\^D\b\0"...,65536) = 10596 (0x2964)
13518: 4.620830499 0.000050112 close(11)	 = 0 (0x0)
13518: 4.624148825 0.000068403 break(0xe44000)	 = 0 (0x0)
13518: 4.630655933 0.000126919 open("/usr/share/locale/en_US.UTF-8/LC_CTYPE",O_CLOEXEC,0666) = 11 (0xb)
13518: 4.630926550 0.000070057 fstat(11,{ mode=-r--r--r-- ,inode=132288,size=76132,blksize=65536 }) = 0 (0x0)
13518: 4.631176742 0.000045122 fstat(11,{ mode=-r--r--r-- ,inode=132288,size=76132,blksize=65536 }) = 0 (0x0)
13518: 4.631422162 0.000043784 lseek(11,0x0,SEEK_CUR) = 0 (0x0)
13518: 4.631664936 0.000042445 lseek(11,0x0,SEEK_SET) = 0 (0x0)
13518: 4.632011403 0.000119448 read(11,"RuneMag1UTF-8\0\0\0\0\0\0\0\0\0"...,65536) = 65536 (0x10000)
13518: 4.632747574 0.000079103 read(11,"@\^D\b\0@\^D\b\0@\^D\b\0@\^D\b\0"...,65536) = 10596 (0x2964)
13518: 4.633894601 0.000069425 close(11)	 = 0 (0x0)
13518: 4.638873827 0.000109916 write(9,"HTTP/1.1 200 OK\r\nContent-type:"...,44) = 44 (0x2c)
13518: 4.639321908 0.000170057 write(9,"<!DOCTYPE html PUBLIC "-//W3C//D"...,85600) = 81616 (0x13ed0)
13518: 4.640090226 0.000052438 poll({9/POLLOUT},1,4000) = 1 (0x1)
13518: 4.640748743 0.000099664 write(9,"ance, Johann Hanne, Boris Lytoch"...,3984) = 3984 (0xf90)
13518: 4.641393844 0.000129956 stat("/home/httpd/www/system/web",{ mode=drwxr-xr-x ,inode=110568,size=15,blksize=4096 }) = 0 (0x0)
13518: 4.641877614 0.000042891 setitimer(2,{0.000000, 0.000000 },0x0) = 0 (0x0)
13518: 4.642830145 0.000041974 getpid()		 = 13518 (0x34ce)
13518: 4.643472691 0.000042961 setitimer(2,{0.000000, 0.000000 },0x0) = 0 (0x0)
13518: 4.644000590 0.000077829 __sysctl(0x7fffffffd3d8,0x2,0x8027e0db0,0x7fffffffd3e0,0x0,0x0) = 0 (0x0)
13518: 4.644593565 0.000113284 open("/dev/null",O_CLOEXEC,00) = 11 (0xb)
13518: 4.645078362 0.000070653 fstat(11,{ mode=crw-rw-rw- ,inode=25,size=0,blksize=4096 }) = 0 (0x0)
13518: 4.645558775 0.000077133 open("/dev/null",O_CLOEXEC,00) = 12 (0xc)
13518: 4.645971445 0.000092082 __sysctl(0x7fffffffd470,0x4,0x0,0x7fffffffd460,0x0,0x0) = 0 (0x0)
13518: 4.646439044 0.000119022 __sysctl(0x7fffffffd470,0x4,0x7e9900,0x7fffffffd460,0x0,0x0) = 0 (0x0)
13518: 4.646921601 0.000071426 close(11)	 = 0 (0x0)
13518: 4.647215820 0.000041939 close(12)	 = 0 (0x0)
13518: 4.647561215 0.000079659 close(9)		 = 0 (0x0)
13518: 4.648209339 0.000112332 writev(0x2,0x7fffffffb470,0x2,0x8ad8d7b1a524b1c9,0x7fffffb93526,0x8025b0de0) = 286 (0x11e)
Не совсем понятно зачем php под фрей запрашивает кучу sysctl да еще и зачем-то в /dev/null лезет. Можно ли это как-то выпилить?

Подскажите пожалуйста куда копать. Если нужна доп. инфа о настройках FreeBSD - пишите.

Заранее благодарен!

★★★★★

FreeBSD 10-STABLE

Их много. В каком месяце собрана хотя бы?

Сразу скажу, что на обеих ОСях php собран одной версией компилятора, одинаковыми модулями и с теми же CFLAGS.

Какой версией? И какого компилятора? Во FreeBSD дефолтный LLVM/Clang 3.3, вообще-то, а все другие, что не по дефолту, — это ваши руки и сексуальные фантазии.

iZEN ★★★★★
()

А я, вот, в процессе тестинга php vs ruby, короче php сливает последней сборке ruby dev 2. Я не фанат руби, скорее наоборот, я за питон) Но. Интересно всё-таки было… Кто прав. Слив примерно 20-40% req/per sec. Unicorn / php-fpm + nginx. Вообще, обожаю тесты, но много времени уходит на их реализацию, я уже согнал в кучу за неделю около 7-8 различных платформ :D

menangen ★★★★★
()

Я знал!

Спасибо, интересно.

drull ★☆☆☆
()
Ответ на: комментарий от iZEN

Ну, смотря что считать «летать», JavaGrails работает в 4-5 раз быстрее нативного ruby, соответственно, JRuby примерно так же. Быстрее только NodeJS и Erlang :) Ну, и, конечно, же порвал всех vibe.d, который на libevent c++

menangen ★★★★★
()
Ответ на: комментарий от iZEN

Их много. В каком месяце собрана хотя бы?

Я его часто обновляю с иллюзорной надеждой что хоть что-то поменяется :)

# uname -a
FreeBSD node2 10.0-BETA3 FreeBSD 10.0-BETA3 #20 r258721: Thu Nov 28 23:29:13 EET 2013     root@node2:/usr/obj/usr/src/sys/TG_NODE_10  amd64

Какой версией?

php55-5.5.5

И какого компилятора?

gcc-4.7.4

Во FreeBSD дефолтный LLVM/Clang 3.3, вообще-то, а все другие, что не по дефолту, — это ваши руки и сексуальные фантазии.

При сборке с Clang 3.3 ситуация никак не меняется. Я изначально и собрал при помощи его. Потом думал что возможно причина в компиляторе и пересобрал той же версией gcc, что и на линуксе, с теми же флагами: -O2 -pipe -march=native -mmmx -msse4.2

iron ★★★★★
() автор топика
Ответ на: комментарий от menangen

Быстрее только NodeJS и Erlang

Да ладно! Памяти меньше уходит, да, а вот про то что быстрее как-то сомнительно. Или вы сравниваете руби как рельсу?

ritsufag ★★★★★
()
Ответ на: комментарий от menangen

Вообще, обожаю тесты, но много времени уходит на их реализацию, я уже согнал в кучу за неделю около 7-8 различных платформ :D

Могу дать доступ к https://github.com/Balancer/benchmarks-fib-obj

Там можно и другие тесты замутить :)

KRoN73 ★★★★★
()
Ответ на: комментарий от ritsufag

Я сравниваю сколько запросов в секунду выдаёт приложение по HTTP. Erlang и Node.JS быстрее Java Grails и Java Jetty в 2 раза. Если вы о Ruby то да, руки дошли только до RoR, но и Grails Java - это тоже клон RoR на Groovy. Т.ч. сравнение вполне честное. В понедельник-вторник буду тестить Sinatra.

menangen ★★★★★
()

Сразу скажу, что на обеих ОСях php собран одной версией компилятора

Между тем, все знают, что ГНУтый компилятор подыгрывает Линуксу, выполняя больше оптимизаций. Иначе чем можно объяснить тот факт, что один и тот же код выполняется за разное время? Очевидно, код не один и тот же, а разный.

Deleted
()
Ответ на: комментарий от KRoN73

Спасибо. Там на гит тесты производительности мат аппарата, я же тестирую фактическую выдачу отрендеренного HTML из БД, прошедший через шаблонизаторы фреймвёрков, либо внешних шаблонных движков типа Mako для Python и Jade для Node.JS. Плюс задействуется ORM, там, где она втроенна в фреймворк. Либо беру самую популярную ORM для данной платформы, например, для Flask - Alchemy.

menangen ★★★★★
()
Ответ на: комментарий от menangen

Там на гит тесты производительности мат аппарата

Фактически тестируется именно работа с объектами (то, на что сегодня уходит львиная доля загрузки в моих Web-задачах. Считая, что БД тормозит примерно одинаково).

я же тестирую фактическую выдачу отрендеренного HTML из БД, прошедший через шаблонизаторы фреймвёрков, либо внешних шаблонных движков типа Mako для Python и Jade для Node.JS. Плюс задействуется ORM, там, где она втроенна в фреймворк.

Ну так отлично же. Я когда-то хотел такое затеять, да руки не дошли, в отличие от упомянутого выше, тут требуется серьёзно ковыряться с фреймворками: https://bitbucket.org/Balancer/frameworksbench

Что плохого в Django? (комментарий)

KRoN73 ★★★★★
()

А с каким libc собиралось? Во фре, по-моему, какой-то свой, оттуда и разница. Пересобери с glibc - скорее всего разница исчезнет.

З.Ы. А как поменяется картина, если включить SELinux?

selivan ★★★
()
Ответ на: комментарий от ritsufag

Конечно, но хотелось точно померить на сколько! =) К тому же, на ноде не только запросы обрабатываются, но и роутинги и т.п.

menangen ★★★★★
()
Ответ на: комментарий от menangen

Интересно, если с настройками JVM поиграться в сторону фиксации максимально возможного размера кучи (-Xms4096m -Xmx4096m) и выбора сборщика мусора G1 (-XX:+UseG1GC -XX:MaxGCPauseMillis=100 -XX:GCPauseIntervalMillis=500), насколько улучшатся результаты?

iZEN ★★★★★
()
Ответ на: комментарий от selivan

Кстати, замена старого рантайма C/C++ во FreeBSD на новый GNUтый описана тут: http://www.freebsd.org/doc/en/articles/custom-gcc/article.html

Я как-то проделывал подобную операцию, чтобы проверить, насколько ускорится работа десктопных приложений (после перекомпиляции всего установленного ПО с новыми рантайм-либами), но разницы не почувствовал.

iZEN ★★★★★
()
Последнее исправление: iZEN (всего исправлений: 1)

libc то разные!
собери eglibc под фрю иди uclibc под обоих
и заюзай гцц вместо шланга

ubuntuawp ★★
()
Ответ на: комментарий от selivan

А с каким libc собиралось? Во фре, по-моему, какой-то свой, оттуда и разница.

Собиралось с дефолтным.

# ldd `which php`
/usr/local/bin/php:
	libcrypt.so.5 => /lib/libcrypt.so.5 (0x800b6a000)
	libpcre.so.3 => /usr/local/lib/libpcre.so.3 (0x800d8a000)
	libm.so.5 => /lib/libm.so.5 (0x800ff1000)
	libxml2.so.5 => /usr/local/lib/libxml2.so.5 (0x801216000)
	liblzma.so.5 => /usr/lib/liblzma.so.5 (0x801575000)
	libz.so.6 => /lib/libz.so.6 (0x801798000)
	libthr.so.3 => /lib/libthr.so.3 (0x8019ad000)
	libc.so.7 => /lib/libc.so.7 (0x801bd2000)
	libgcc_s.so.1 => /usr/local/lib/gcc47/libgcc_s.so.1 (0x801f6d000)

Пересобери с glibc - скорее всего разница исчезнет.

А разве можно под фрей собрать линуксовый glibc? Именно собрать а не юзать древнее бинарное Г от федоры.

З.Ы. А как поменяется картина, если включить SELinux?

На линуксе, я так понимаю? Подобной дрянью не хочу засорять систему. Цель ОСи в кластере - выдавить максимум из железа. По сему там вся система собрана с:

CFLAGS="-O2 -pipe -march=native -mtune=core-avx-i -msse4.2 -mmmx -mfpmath=sse,387 -g0 -Wno-all -flto=8 -fuse-linker-plugin -fopenmp -floop-parallelize-all -ftree-parallelize-loops=8 -funroll-loops -funroll-all-loops -ftree-vectorize -floop-interchange -ftree-loop-distribution -floop-strip-mine -floop-block -fgraphite-identity"
..., ядро с множеством тюнов и скомпилировано с LTO оптимизацией. По этому и производительность реактивная по сравнению с бинарными сборками пингвинов. Хз, может из за этого такая разница с фрей. Пол года кластер в строю, работает стабильно и держит большие нагрузки.

З.Ы. Просьба не разводить срач по поводу source-based дистрибутивов, оптимизаций и прочего. В любом случае каждый останется при своим мнении. Каждый выбирает инструмент под себя. Каждый из нас верит в то, во что верит... :)

iron ★★★★★
() автор топика
Ответ на: комментарий от gwinn

А почему не php-fpm? В чем профит uwsgi?

Вы почитайте какие фичи есть у uwsgi и fpm, проведите тесты. Прежде чем приступать к решению задачи, я тестирую все доступные инструменты. Тот, который оказывается быстрее всех - тот и юзаю. Лично для моих задач, uwsgi оказался 1) чуток быстрее чем fpm (конечно, если его правильно «приготовить») 2) имеет кучу полезных фич, которых fpm лишен. Самое существенное для меня это возможность задавать нужное количество тредов и воркеров + автоматический спавнинг их по алгоритму busyness, слежение воркеров за потреблением памяти процессов и автоперезапуск при утечках, авто релод воркеров после определенного количества выполненных процессов, слежение за состоянием процессов (если кто-нить завис - прибивает и спавнит новый), emperor который заменяет дополнительную сущность в виде HeartBeat. Помимо всего этого есть множество плюшек.

iron ★★★★★
() автор топика
Ответ на: комментарий от iron

А что за модуль uwsgi вы юзаете на стороне веб сервера? 100% nginx. Наверное, и модуль там стандартный есть для uwsgi.

menangen ★★★★★
()
Ответ на: комментарий от menangen

Да хватит здесь жабу обсуждать. Лучше подскажите как фрю ускорить. А то тимлид у меня на работе всю жизнь свято верит что лучше фри нету ничего. Он же повесится когда я ему покажу график аббикса по количеству потребления CPU фри-ным серверов в соотношении к количеству обработанных запросов нашего приложения :)

iron ★★★★★
() автор топика
Ответ на: комментарий от iron

А разве можно под фрей собрать линуксовый glibc?

Выше iZEN писал ссылку: http://www.freebsd.org/doc/en/articles/custom-gcc/article.html. Вобщем, топик можно озаглавить «glibc vs bsd libc»

Подобной дрянью не хочу засорять систему.

Просто интереса ради. Понятно, что если цель - максимальная производительноть, SELinux там не будет

Просьба не разводить срач по поводу source-based дистрибутивов

Как можно? Мы же на ЛОРе! Настоящему джентельмену такое даже в голову прийти не может!
*поправил монокль

selivan ★★★
()
Ответ на: комментарий от menangen

А что за модуль uwsgi вы юзаете на стороне веб сервера? 100% nginx. Наверное, и модуль там стандартный есть для uwsgi.

Весь удар на себя принимает nginx, у него саме быстрые веврайты (по моим личным тестам). Правда у uwsgi есть возможность и реврайты писать (точнее роуты). Если урл ведет к динамике, по TCP коннектится в haproxy, который балансирует нагрузку между парком бекендов с запущенными uwsgi. Сессии находятся в редисе на фронтенде. emperor будет висеть отдельным процессом на фронтенде и всех бекендах, один из которых, в зависимости от веса, станет фронтендом в случае падения последнего. Но всю эту структуру я еще не до конца внедрил, все еще на стадии тестирования.

iron ★★★★★
() автор топика

а если линуксовые бинарники на фре через линуксулятор запустить?

Harald ★★★★★
()
Ответ на: комментарий от iZEN

замена старого рантайма C/C++ во FreeBSD на новый GNUтый

А какой смысл вообще использовать фрю, если всё равно придётся менять libc на столлмана-поделку?

Ivan_qrt ★★★★★
()
Ответ на: комментарий от selivan

Выше iZEN писал ссылку: http://www.freebsd.org/doc/en/articles/custom-gcc/article.html. Вобщем, топик можно озаглавить «glibc vs bsd libc»

Где там *libc по ссылке? Там стандартная процедура установки gcc и binutils которая выполняется перед установкой портов. У меня все порты именно так и собраны. Что касается libgcc_s.so.1 и прочего, оно автоматом добавляется в /etc/libmap.conf после установки gcc. По сему, я до сих пор не могу понять о каком glibc под фрей идет речь.

Просто интереса ради. Понятно, что если цель - максимальная производительноть, SELinux там не будет

SELinux это редхатовская приблуда, которую почти все сразу же выключает когда начинает что-то глючить. :) Для Gentoo оно есть, но прилеплено скотчем. По сему, не так хорошо интегрировано в систему как в шапке. Да, взяв напильник в твердую админскую руку его можно прилепить. :) Но смысла в этом 0.

iron ★★★★★
() автор топика
Ответ на: комментарий от Ivan_qrt

А какой смысл вообще использовать фрю, если всё равно придётся менять libc на столлмана-поделку?

Плюсую. В инете все BSD-шники с пеной у рта доказывают что лучше православного kqueue ничего нет и быть не может. Вот и хочется в этом убедиться. Зачем же изврат с линуксом во фре...

iron ★★★★★
() автор топика
Ответ на: комментарий от baka-kun

Ты тестируешь производительность phpinfo()? Самому не смешно?

Не смешно, так как производительность php под фрей на тяжелом движке по отношению в линуксу примерно эквивалентна скорости выполнения phpinfo. Трейс именно phpinfp я и привел как пример. Я же не буду здесь выкладывать трейс движка на десятки а то и сотни страниц текста.

iron ★★★★★
() автор топика
Ответ на: комментарий от RedEyedMan3

А я хотел фряшеньку поставить =\

Просьба не брать во внимание мой конкретный пример. Собственно я и обратился сюда за помощью найти то, что я упустил. Возможно кто-то подскажет какой-нить чудо-sysctl который решит проблему. И фря заживет у меня долго и счастливо. :)

iron ★★★★★
() автор топика
Ответ на: комментарий от iron

И тут еще один вопросик:

А как фряха ведет себя при своппинге? Лялекс вымораживает своими лагами при своппинге. Жутко раздражает.

RedEyedMan3
()
Ответ на: комментарий от iron

Не смешно

Я зря. Покажи оба вывода phpinfo().

Трейс именно phpinfp я и привел как пример.

Я не вижу в трейсе линукса, где читается сам info.php, наверное стар стал. :( Трейсы не одного и того же приведены, сравнивать их глупо.

baka-kun ★★★★★
()
Ответ на: комментарий от RedEyedMan3

Лялекс вымораживает своими лагами при своппинге
Лялекс

к логопеду! А лаги при своппинге будут всегда если раздел со свопом на каком-то убогом диске.

fang90 ★★★★★
()
Ответ на: комментарий от RedEyedMan3

А как фряха ведет себя при своппинге? Лялекс вымораживает своими лагами при своппинге. Жутко раздражает.

ИМХО, если сервер свопится - это значит то, что существующие ресурсы системы распределены неправильно по отношению к требованию, выдвигаемым к производительности сервера - как вычислительной единицы всей системы серверов. Следовательно, я не допускал чтоб сервак залазил в своп. По сему, я не знаю как фря себя ведет в таких ситуациях. Пускай лучше кто-то другой ответит.

iron ★★★★★
() автор топика
Ответ на: комментарий от iron

имеет кучу полезных фич, которых fpm лишен. Самое существенное для меня это возможность задавать нужное количество тредов и воркеров + автоматический спавнинг

Это же есть в php-fpm. А ля:

pm.max_children = 10
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 10

их по алгоритму busyness

Разве что про алгоритм ничего не знаю.

слежение воркеров за потреблением памяти процессов и автоперезапуск при утечках

Зачем оно при авторелоадах?

авто релод воркеров после определенного количества выполненных процессов

pm.max_requests = 500

слежение за состоянием процессов

Аналогично не нужно при авторелоадах.

KRoN73 ★★★★★
()
Последнее исправление: KRoN73 (всего исправлений: 1)
Ответ на: комментарий от baka-kun

Я зря. Покажи оба вывода phpinfo().

FreeBSD
Gentoo
По началу думал что разница в производительности из за того, что во фре пых собирается модульно. В генте вродь идет только монолит с возможностью вкл/выкл при помощи USE. Собрал во фре пых ручками и теми же флагами компиляции, но ситуация не изменилась. Плюнул, и собрал обратно с портов. Единственное, пришлось во фре увеличить количество памяти, так как по не ведомой для меня причине, php процессы во фре жрали больше памяти чем в линуксе на нашем движке. Профилировать и искать причину лень. Еще во фре добавил три модуля: sysvmsg, sysvsem, sysvshm. Правда они какой погоды не сделали.

iron ★★★★★
() автор топика
Ответ на: комментарий от KRoN73

Разве что про алгоритм ничего не знаю.

http://uwsgi-docs.readthedocs.org/en/latest/Cheaper.html?highlight=busyness

Зачем оно при авторелоадах?
Аналогично не нужно при авторелоадах.

Если воркер завис, то он находится в состоянии busy и не принимает новые коннекшины. И следовательно, он никогда не достигнет точки авторелода.

iron ★★★★★
() автор топика
Ответ на: комментарий от iron

И следовательно, он никогда не достигнет точки авторелода.

Хм. Логично. Тогда странно, что я за несколько машинолет с php-fpm на нагруженных проектах с этим никогда не столкнулся. То ли повезло и мой фреймворк никогда не зависает, то ли php-fpm, всё же, с этим как-то борется.

KRoN73 ★★★★★
()
Ответ на: комментарий от ZenitharChampion

слабая - ресурсоёмкое DE.

Gentoo - это инструмент. Лепи с него все что хочешь при наличии навыков и опыта. Ясный хрен что большинству при выборе дистриба по душе принцип святого дефолта. Зачем заморачиваться с настройкой если можно поставить то, что уже настроено и может быть установлено в два клика. Как говорится, на вкус и цвет - фломастеры разные.

Сильная сторона FreeBSD - ZFS.

Не только. К примеру, тестил при помощи sysbench и оказалось, что с mutex-ами работает в 2 раза быстрее чем линукс, с тредами почти на ровне, по скорости памяти проигрывает. Понятное дело, что один лишь sysbench не является объективным показателем. Но устраивать зоопарк тестов лень. И так много времени на все это дело убил.
TCP стек - просто сказка. Правда параметры по дефолту низкие, без напильника никак. Пришлось помучиться чтоб завести на полную 10Gbe карточку. Кстати, линукс искаробки эту карточку пригрузил. С дровами на экзотическое железо хреново. Возможности дебага и мониторинга ресурсов, работа с оперативкой, выделение/разделение ресурсов, контроль прерываний и прочее мне показалось продвинутее чем в линуксе. К примеру, «systat -vmstat», «top -aSCHIPz» и «vmstat -z» показываю практически все что нужно знать о производительности системы. Как для роутера без сложной приоретизации трафика и файлопомойки подходит идеально. Еще бы решить проблему со скоростью php и можно загонять в кластер :)

iron ★★★★★
() автор топика
Ответ на: комментарий от KRoN73

То ли повезло и мой фреймворк никогда не зависает, то ли php-fpm, всё же, с этим как-то борется.

Такое бывает не часто. Но если идет активная разработка движка, то не всегда получается отловить все глюки при тестировании. Порой этот функционал очень спасает на продакшине.

iron ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.