ПРОЕКТЫ 


  АРХИВ 


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



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


 




Copyright © Lexa Software, 1996-2009.