Re: В логах pread() failed
Igor Sysoev
igor на sysoev.ru
Ср Мар 10 13:46:05 MSK 2010
On Wed, Mar 10, 2010 at 01:26:48PM +0300, Maxim Dounin wrote:
> > >> Подниму старую тему. Та же проблема, на маленьких файлах .js
> > >> nginx/0.7.65
> > >> 7.2-RELEASE FreeBSD
> > >> ufs, gmirror
> > >>
> > >> directio вообще не описан в конфиге, только
> > >> sendfile off;
> > >>
> > >> из кеширования есть еще:
> > >> open_file_cache max=10000 inactive=200s;
> > >> open_file_cache_valid 2s;
> > >> open_file_cache_min_uses 2;
> > >> open_file_cache_errors off;
> > >>
> > >> open_file_cache_valid раньше был 300 секунд, сейчас занизил. не
> > >> помогает. ошибки о несоответствии ожидаемого и фактического размеров
> > >> не уходят.
> >
> > > Такое может быть, если файлы переписываются по месту.
> >
> > Есть такое, по крону раз в 10 часов, но может быть форсировано вручную, через веб, файл изменяется
> > php скриптом fopen('', "w")
>
> Не делайте так (c)
>
> Вообще странно что ещё кто-то так делает. Апач в подобных
> ситуациях при некоторой доле везения начинал есть 100% CPU, должно
> было всех отучить надолго. Забывается история... ;)
>
> > > Сейчас open_file_cache проверяет inode number. При редактировании
> > > файла по месту - он не меняется, и кеш считает файл неизменившимся
> > > со всеми вытекающими последствиями. Можно пытаться проверять ещё
> > > и размер/mtime, но это в общем-то мёртвому припарки - лишь снижает
> > > вероятность проблемы, но не устраняет её (т.е. если вы поменяете
> > > файл в момент между проверкой размера и собственно отдачей клиенту
> > > - опять же будет ошибка).
> >
> > А как же open_file_cache_valid 2s ?
> > Даже если в течении этих 2х секунд и был старый inode number и
> > следовательно старый размер файла, то почему ошибка остается и в
> > дальнейшем, пока не graceful ну и restart само собой?
>
> Потому что 2 секунды - это вообще ничего не проверять. Через 2
> секунды будет сделан stat(), nginx убедится что inode number не
> поменялся - и с чистой совестью продолжит возвращать старые
> данные.
>
> На самом деле под FreeBSD всё немного не так (ибо вместо
> периодического stat()'а используется kevent(EVFILT_VNODE)), но часто
> запрашиваемый файл который пишут по месту поймается точно так же.
Для того, чтобы использовался EVFILT_VNODE, нужно поставить
open_file_cache_events on;
Но ставить не рекомендуется - там сейчас есть race condition, из-за
которого воркер падает.
--
Игорь Сысоев
http://sysoev.ru
Подробная информация о списке рассылки nginx-ru