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