РИТ: Высокие нагрузки vs Highload++
Igor Sysoev
is at rambler-co.ru
Fri Sep 19 11:30:55 MSD 2008
On Fri, Sep 19, 2008 at 11:06:41AM +0400, Михаил Монашёв wrote:
> Здравствуйте, Игорь.
>
> А патчик выкладывать где-то планируешь?
Более того, хочу чтобы закомитили.
Патч прилагается.
Но хочу предупредить, что на обычной FreeBSD имеет смысл увеличивать
только до 128K:
sysctl kern.ipc.sfreadahead=131072
что в ситуации с мелкими картинками должно быть достаточно.
Ещё можно попробовать
sysctl kern.ipc.sfrefer=1
чтобы часто используемые картинки не вытяснялись из VM редко используемыми.
> IS> В общем, научили мы sendfile читать по 2M:
>
> IS> #sysctl kern.ipc.sfreadahead
> IS> kern.ipc.sfreadahead: 2097152
>
> IS> и правильно кэшировать частоиспользуемое (1190M Active):
>
> IS> CPU states: 0.3% user, 0.0% nice, 0.9% system, 2.6% interrupt, 96.3% idle
> IS> Mem: 1190M Active, 2271M Inact, 341M Wired, 140M Cache, 214M Buf, 8908K Free
>
> IS> PID USERNAME THR PRI NICE SIZE RES STATE C TIME WCPU COMMAND
> IS> 1278 nobody 1 4 0 12704K 4420K kqread 1 0:20 0.00% nginx
> IS> 1266 nobody 1 4 0 12704K 4396K kqread 1 0:16 0.00% nginx
> IS> 1267 nobody 1 4 0 12704K 4348K kqread 1 0:15 0.00% nginx
>
> IS> Итого, имеем на данный момент:
>
> IS> L(q) ops/s r/s kBps ms/r w/s kBps ms/w %busy Name
> IS> 0 7 7 6650 23.7 0 0 0.0 16.6| ad16
> IS> 0 7 7 8376 24.8 0 0 0.0 17.3| ad18
> IS> 0 7 7 8376 26.8 0 0 0.0 18.8| ad20
> IS> 0 7 7 8504 25.0 0 0 0.0 17.5| ad22
> IS> 0 28 28 31907 25.1 0 0 0.0 52.7| mirror/dat
>
> IS> В 3-4 раза можно вырасти.
>
> IS> Памяти под сетевые буфера всего 4M:
>
> IS> 3092K/632K/3725K bytes allocated to network (current/cache/total)
--
Игорь Сысоев
http://sysoev.ru
-------------- next part --------------
--- sys/kern/uipc_syscalls.c.orig 2008-09-18 19:13:33.000000000 +0400
+++ sys/kern/uipc_syscalls.c 2008-09-18 19:12:20.000000000 +0400
@@ -98,6 +98,8 @@
int nsfbufs;
int nsfbufspeak;
int nsfbufsused;
+static int sfreadahead = MAXBSIZE;
+static int sfrefer;
SYSCTL_INT(_kern_ipc, OID_AUTO, nsfbufs, CTLFLAG_RDTUN, &nsfbufs, 0,
"Maximum number of sendfile(2) sf_bufs available");
@@ -105,6 +107,10 @@
"Number of sendfile(2) sf_bufs at peak usage");
SYSCTL_INT(_kern_ipc, OID_AUTO, nsfbufsused, CTLFLAG_RD, &nsfbufsused, 0,
"Number of sendfile(2) sf_bufs in use");
+SYSCTL_INT(_kern_ipc, OID_AUTO, sfreadahead, CTLFLAG_RW, &sfreadahead, 0,
+ "Number of sendfile(2) read-ahead blocks");
+SYSCTL_INT(_kern_ipc, OID_AUTO, sfrefer, CTLFLAG_RW, &sfrefer, 0,
+ "Enable page references set by sendfile(2)");
/*
* Convert a user file descriptor to a kernel file entry. A reference on the
@@ -2029,9 +2035,14 @@
* send them off before we come here again and
* block.
*/
- if (pg->valid && vm_page_is_valid(pg, pgoff, xfsize))
+ if (pg->valid && vm_page_is_valid(pg, pgoff, xfsize)) {
+ if (sfrefer) {
+ vm_page_lock_queues();
+ vm_page_flag_set(pg, PG_REFERENCED);
+ vm_page_unlock_queues();
+ }
VM_OBJECT_UNLOCK(obj);
- else if (m != NULL)
+ } else if (m != NULL)
error = EAGAIN; /* send what we already got */
else if (uap->flags & SF_NODISKIO)
error = EBUSY;
@@ -2058,9 +2069,9 @@
* wrong, but is consistent with our original
* implementation.
*/
- error = vn_rdwr(UIO_READ, vp, NULL, MAXBSIZE,
+ error = vn_rdwr(UIO_READ, vp, NULL, sfreadahead,
trunc_page(off), UIO_NOCOPY, IO_NODELOCKED |
- IO_VMIO | ((MAXBSIZE / bsize) << IO_SEQSHIFT),
+ IO_VMIO | ((sfreadahead / bsize) << IO_SEQSHIFT),
td->td_ucred, NOCRED, &resid, td);
VOP_UNLOCK(vp, 0, td);
VFS_UNLOCK_GIANT(vfslocked);
More information about the nginx-ru
mailing list