我们有一个安装了Drupal 7站点的设置,这个站点具有以下设置 – 运行Web虚拟机和NFS虚拟机的VMware ESXi 4.1主机服务器。 Web虚拟机正在使用Apache和mod_php。 该网站仍在开发中,因此我们不得不closures所有forms的caching由于经常更新的文件。
每个页面请求大约需要15-20秒才能完成。 对PHP代码进行性能分析显示绝大多数时间(通常超过90%)都是通过加载模块的所有is_dir(),is_file()函数调用进行的。
我已经将PHP的实际pathcaching大小增加到几个兆字节,strace显示lstat调用从200降到6左右,stat()减less了一些(大约600次调用)。 然而,虽然这已经削减了相当多的时间,但对于要求最严格的页面,我无法突破10秒的每个请求屏障。
有没有一种方法可以从这个设置中获得更好的性能,而不涉及caching?
编辑:MySQL不是问题,查询caching意味着请求最多需要一秒钟才能完成。
configuration和统计:
VM主机:单四核至强CPU
虚拟机:
web – Centos 6 64bt,2.5GB RAM,普通CPU / HD优先级(2核)nfs – Centos 6 64bt,2GB RAM,正常的CPU优先级(4核),高清优先级
PHP:32M实际pathcaching大小(testing目的是这么高)
NFS:
~]# egrep -v '#|^$' /etc/nfsmount.conf [ NFSMount_Global_Options ] Defaultvers=4 Ac=False Rsize=32k Wsize=32k Bsize=32k
通过NFS读取速度不是问题使用32k块返回的100Mtesting文件的dd:
3200+0 records in 3200+0 records out 104857600 bytes (105 MB) copied, 1.84984 s, 56.7 MB/s real 0m1.857s user 0m0.007s sys 0m0.330s
在空进程caching的Apache进程Strace:
% time seconds usecs/call calls errors syscall ------ ----------- ----------- --------- --------- ---------------- 50.78 1.157452 337 3434 28 stat 32.58 0.742656 628 1182 425 open 9.29 0.211788 762 278 1 lstat 3.17 0.072322 0 237865 write 2.45 0.055839 490 114 13 access 0.45 0.010262 43 237 brk 0.34 0.007725 10 811 74 read 0.28 0.006340 9 679 fstat 0.22 0.005069 18 281 poll 0.20 0.004533 6 698 getdents 0.09 0.001960 10 190 mmap 0.05 0.001065 14 74 accept4 0.04 0.001000 333 3 chdir 0.03 0.000750 4 190 munmap 0.01 0.000339 0 836 close 0.01 0.000247 3 75 writev 0.00 0.000068 0 611 fcntl 0.00 0.000063 1 77 shutdown 0.00 0.000000 0 1 lseek 0.00 0.000000 0 5 rt_sigaction 0.00 0.000000 0 1 rt_sigprocmask 0.00 0.000000 0 3 setitimer 0.00 0.000000 0 5 socket 0.00 0.000000 0 5 5 connect 0.00 0.000000 0 74 getsockname 0.00 0.000000 0 15 setsockopt 0.00 0.000000 0 5 getcwd 0.00 0.000000 0 1 futex ------ ----------- ----------- --------- --------- ----------------
实时path后的Strace被caching
% time seconds usecs/call calls errors syscall ------ ----------- ----------- --------- --------- ---------------- 60.14 1.371006 484 2831 28 stat 31.79 0.724705 627 1155 425 open 3.53 0.080354 0 237865 write 2.65 0.060433 530 114 13 access 0.43 0.009913 99 100 brk 0.38 0.008730 11 804 74 read 0.35 0.007910 12 675 fstat 0.30 0.006775 10 654 getdents 0.13 0.003065 11 281 poll 0.09 0.002000 333 6 1 lstat 0.07 0.001545 2 807 close 0.05 0.001063 14 74 accept4 0.04 0.001000 6 179 mmap 0.02 0.000404 2 179 munmap 0.01 0.000271 4 75 writev 0.01 0.000212 0 611 fcntl 0.01 0.000129 2 77 shutdown 0.00 0.000022 0 74 getsockname 0.00 0.000000 0 1 lseek 0.00 0.000000 0 5 rt_sigaction 0.00 0.000000 0 1 rt_sigprocmask 0.00 0.000000 0 3 setitimer 0.00 0.000000 0 3 socket 0.00 0.000000 0 3 3 connect 0.00 0.000000 0 15 setsockopt 0.00 0.000000 0 5 getcwd 0.00 0.000000 0 3 chdir ------ ----------- ----------- --------- --------- ----------------
安装:
nfs.xxx.xxx.xxx:/path/to/website/files on /path/to/website/files type nfs (rw,hard,intr,noac,vers=4,addr=xx.xx.xx.xx,clientaddr=xx.xx.xx.xx)
任何帮助,自然,赞赏。
坦率地说,NFS上的Drupal是一只真正的猪。 至多,你想通过NFS或像gluster一样分享“文件”主任{y,ies}。 在NFS上运行DocRoot的问题是,所有的lstat(2)和access(2)调用都是杀手,更不用说在模块目录中会看到getdents(2)和朋友了。 像APC的东西将显着帮助实际读取(2)时间,以及消除编译延迟,但PHP仍然会对每个文件执行lstat(2)和access(2)。 为了进一步加快速度,你可以设置apc.stat = 0,但是如果你说,你不断地改变PHP文件,除非你愿意重启Apache(或者手动清除APCcaching通过apc.php)每次你做这样的改变。
最佳做法build议将DocRoot存储在专用的优化设备(如SAN)上,或者分别存储在每个站点上。 通常应该通过gluster / nfs / etc来共享“files”目录,但是作为一种select,您也可以定期在服务器之间进行rsync,具体取决于使用情况以及前面的LB是否支持粘性会话。 您也可以使用CDN或Amazon S3或BlackMesh的Swift等服务完全清除文件目录。
具有Drupal详细专业知识的托pipe服务提供商可以帮助您解决这些架构问题; 你可能希望联系Acquia或BlackMesh(我为后者工作)。 我不知道Acquia是否可以,但是我知道BlackMesh也提供非现场协助,我们与您现有的托pipe服务提供商或现场托pipe合作,优化Drupal解决scheme。
祝您网站好运!
通常noac安装是一个性能杀手。
你为什么用它?
编辑:我看到上面的评论,你说你以后添加更多的Web服务器和负载平衡器。 正如BMDanbuild议,如果您的应用程序要求您使用noac ,则应该查看群集文件系统(例如OCFS2)。
干杯