Перенес большой блог со старого сервера на новый. Клиент пожаловался, что стал сильно тормозить редактор Tiny MCE, а точнее TinyBrowser (файловый менеджер). Стал разбираться и выяснил, что тормозит функция построения дерева папок dirtree.
На старом сервере функция выполняется около 50 ms, на новом почти 10 секунд (медленнее в 200 раз). Похоже, тормозят функции glob и readdir. Каталоги идентичны: 3000 папок, 80 тысяч файлов. При этом в момент выполнения функции загрузка процессора 100%, загрузка диска 0% (смотрел через atop). В чем может быть дело?
Старый сервер:
2 x Intel Xeon 5650, 16 GB RAM, 4 SAS диска в аппаратном RAID-10, файловая система Ext3, Debian
Новый сервер:
2 x Intel Quad Core Xeon L5410, 16 GB RAM, 4 SAS диска в аппаратном RAID-10, файловая система Ext4, CentOS 6
Функция dirtree:
function dirtree(&$alldirs, $root = '', $tree = '', $branch = '', $level = 0)
{
if ($level == 0 && is_dir($root . $tree . $branch))
{
$filenum = count(glob($root . $tree . $branch . '*.*', GLOB_NOSORT));
$topname = end(explode('/', rtrim($tree, '/')));
$alldirs[] = array($branch, rtrim($topname, '/') . ' (' . $filenum . ')', rtrim($topname, '/'), rtrim($topname, '/'), $filenum, filemtime($root . $tree . $branch));
}
$level++;
$dh = opendir($root . $tree . $branch);
while (($dirname = readdir($dh)) !== false)
{
if (substr($dirname, 0, 1) != '.' && is_dir($root . $tree . $branch . $dirname) && $dirname != '_thumbs')
{
$filenum = count(glob($root . $tree . $branch . $dirname . '/' . '*.*', GLOB_NOSORT));
$indent = '';
for ($i = 0; $i < $level; $i++)
{
$indent .= ' ';
}
if (strlen($indent) > 0) $indent .= '→ ';
$alldirs[] = array(urlencode($branch . $dirname . '/'), $indent . $dirname . ' (' . $filenum . ')', $indent . $dirname, $dirname, $filenum, filemtime($root . $tree . $branch . $dirname));
dirtree($alldirs, $root, $tree, $branch . $dirname . '/', $level);
}
}
closedir($dh);
$level--;
}
Mount:
/dev/sda2 on / type ext4 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
tmpfs on /dev/shm type tmpfs (rw)
/dev/sda1 on /boot type ext2 (rw)
/dev/sda4 on /tmp type ext4 (rw,noexec,nosuid,nodev)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
/etc/named on /var/named/chroot/etc/named type none (rw,bind)
/var/named on /var/named/chroot/var/named type none (rw,bind)
/etc/named.rfc1912.zones on /var/named/chroot/etc/named.rfc1912.zones type none (rw,bind)
/etc/rndc.key on /var/named/chroot/etc/rndc.key type none (rw,bind)
/usr/lib64/bind on /var/named/chroot/usr/lib64/bind type none (rw,bind)
/etc/named.iscdlv.key on /var/named/chroot/etc/named.iscdlv.key type none (rw,bind)
/etc/named.root.key on /var/named/chroot/etc/named.root.key type none (rw,bind)
dmesg:
pastebin.com/eZpGvnva