Месяц назад этому блогу исполнился 1 год. Надеюсь, все мои читатели читали его с удовольствием. Я никогда не просил помощи и всегда предлагал помощь людям, которые в ней нуждались. Но сегодня мне приходится просить о помощи, потому что это первый случай в моей долгой практике, когда я не знаю, как решить мою проблему.

Итак, суть проблемы.
Есть сервер - 2xXeon 3.2Ghz, 4 Gb RAM. На нем проект на php, у которого в админке есть достаточно-таки тяжелые страницы (700кб-1,5Мб). Данный проект был перенесен на этот сервер со старого медленного, где он успешно работал свои более двух лет.

После переноса и запуска проекта заметили проблему - иногда при переходе на ссылки, ведущие на те самые тяжелые страницы, Firefox предлагал сохранить файлик на диск. При сохранении мы видели нужные нам данные в перемешку с 1-2 блоками нулевых байтов.

После попыток решить проблему обновлением софта и/или откатыванием на старые версии (пробовали lighttpd, php 4.4, 5.0, 5.1, 5.2.0, 5.2.1 and 5.2.2RC2, apache 1.3, 2.0, 2.2, nginx 0.4.x and 0.5.x) увидели, что проблема остается, а меняются только масштабы и частота
возникновения (мусор в выдаче присутствовал не всегда и не у всех клиентов).

После полутора суток без сна и попыток решить проблему пришел черед покопаться во внутренностях софта. strace показал, что пхп отдает все и всегда правильно. А вот выдача веб-сервера почти всегда разная. И вот здесь наткнулись на самое главное:

1) создали файл с 1М пробелов и обозвали его test.php.
2) скачали его 100 раз через nginx на локальную тачку - результат не порадовал - 70 процентов файлов были больше 1М и содержали в середине блок нулевых байтов.
3) взяли тот же пхп файл и переименовали его чтобы он отдавался как статика
4) 100 запросов - все идеально
5) запустили strace на единственного на тот момент воркера и попросили записать лог в файл.
6) Сервер сильно “прогнулася” под strace’ом, пишущим логи в момент, когда запустили тест, НО! - все файлы отдались без проблем (хотя и со скоростью 500Кбайт в сек).
7) Перезапустили тест и в середине тестирования убили strace - почти все оставшиеся файлы оказались побитыми.

В качестве дополнительных извращений пробовали отключение epoll, tcp_nodelay и прочих полезных штук - это только влияло на масштабы трагедии, но не решало проблему.

Конечным (я надеюсь, что временным) решением стал limit_rate = 128Kbytes/s. На нем в данный момент проблем не наблюдается (я пока не нашел).

Прошу всех читателей помочь разобратся в причине проблемы, т.к. очень не хочу, чтобы она проявилась на другом сервере при отсутствии у меня “нормального” решения. Заранее всем благодарен!