РИТ: Высокие нагрузки 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