ПРОЕКТЫ 


  АРХИВ 


Apache-Talk @lexa.ru 

Inet-Admins @info.east.ru 

Filmscanners @halftone.co.uk 

Security-alerts @yandex-team.ru 

nginx-ru @sysoev.ru 


  СТАТЬИ 


  ПЕРСОНАЛЬНОЕ 


  ПРОГРАММЫ 



ПИШИТЕ
ПИСЬМА












     АРХИВ :: nginx-ru
Nginx-ru mailing list archive (nginx-ru@sysoev.ru)

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

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



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
--- 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);


 




Copyright © Lexa Software, 1996-2009.