Cтранности с kevent

Igor Sysoev is at rambler-co.ru
Wed Nov 26 17:43:10 MSK 2008


On Wed, Nov 26, 2008 at 09:22:53PM +0700, Александр Кутузов wrote:

> коли уж о раздаче опять пошло:
> 
> а файлы с 6 до 25 метров тоже через сендфайл лучше раздовать ?

Да, именно для больших файлов данный патч и нужен.

> и если не сложно можно линк на патч а то я по архиву рассылки не могу  
> найти?

Патч прилагается. Там два параметра:

sysctl kern.ipc.sfreadahead
Число блоков размером MAXBSIZE (64K), которые читаются за раз, по умолчанию, 1.

sysctl kern.ipc.sfrefer - этот не нужно использовать.

Кроме того, в ядро нудно пересобрать с параметром

options         MAXPHYS=(1024*1024)

После этого можно будет задать kern.ipc.sfreadahead=16 (1024/64).
Без увеличения MAXPHYS максимальный kern.ipc.sfreadahead, имеющий смысл - 2.


-- 
Игорь Сысоев
http://sysoev.ru
-------------- next part --------------
--- sys/kern/uipc_syscalls.c	2008-09-18 19:13:33.000000000 +0400
+++ sys/kern/uipc_syscalls.c	2008-09-19 18:05:34.000000000 +0400
@@ -98,6 +98,8 @@
 int nsfbufs;
 int nsfbufspeak;
 int nsfbufsused;
+static int sfreadahead = 1;
+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 MAXBSIZE 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,14 +2035,20 @@
 			 * 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;
 			else {
 				int bsize, resid;
+				int readahead = sfreadahead * MAXBSIZE; 
 
 				/*
 				 * Ensure that our page is still around
@@ -2058,9 +2070,9 @@
 				 * wrong, but is consistent with our original
 				 * implementation.
 				 */
-				error = vn_rdwr(UIO_READ, vp, NULL, MAXBSIZE,
+				error = vn_rdwr(UIO_READ, vp, NULL, readahead,
 				    trunc_page(off), UIO_NOCOPY, IO_NODELOCKED |
-				    IO_VMIO | ((MAXBSIZE / bsize) << IO_SEQSHIFT),
+				    IO_VMIO | ((readahead / 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