From owner-svn-src-projects@freebsd.org Wed Dec 16 22:34:43 2015 Return-Path: Delivered-To: svn-src-projects@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 8CE3AA4AE61 for ; Wed, 16 Dec 2015 22:34:43 +0000 (UTC) (envelope-from glebius@FreeBSD.org) Received: from repo.freebsd.org (repo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 4B53919C6; Wed, 16 Dec 2015 22:34:43 +0000 (UTC) (envelope-from glebius@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id tBGMYg6o001978; Wed, 16 Dec 2015 22:34:42 GMT (envelope-from glebius@FreeBSD.org) Received: (from glebius@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id tBGMYgxA001975; Wed, 16 Dec 2015 22:34:42 GMT (envelope-from glebius@FreeBSD.org) Message-Id: <201512162234.tBGMYgxA001975@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: glebius set sender to glebius@FreeBSD.org using -f From: Gleb Smirnoff Date: Wed, 16 Dec 2015 22:34:42 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r292380 - in projects/sendfile: sys/kern sys/sys usr.bin/netstat X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 16 Dec 2015 22:34:43 -0000 Author: glebius Date: Wed Dec 16 22:34:41 2015 New Revision: 292380 URL: https://svnweb.freebsd.org/changeset/base/292380 Log: Add a bunch of extra statistics for the new sendfile(2). Modified: projects/sendfile/sys/kern/uipc_syscalls.c projects/sendfile/sys/sys/sf_buf.h projects/sendfile/usr.bin/netstat/mbuf.c Modified: projects/sendfile/sys/kern/uipc_syscalls.c ============================================================================== --- projects/sendfile/sys/kern/uipc_syscalls.c Wed Dec 16 22:26:28 2015 (r292379) +++ projects/sendfile/sys/kern/uipc_syscalls.c Wed Dec 16 22:34:41 2015 (r292380) @@ -2161,6 +2161,7 @@ sendfile_swapin(vm_object_t obj, struct if (vm_page_is_valid(pa[i], vmoff(i, off) & PAGE_MASK, xfsize(i, npages, off, len))) { vm_page_xunbusy(pa[i]); + SFSTAT_INC(sf_pages_valid); i++; continue; } @@ -2172,8 +2173,10 @@ sendfile_swapin(vm_object_t obj, struct */ for (j = i + 1; j < npages; j++) if (vm_page_is_valid(pa[j], vmoff(j, off) & PAGE_MASK, - xfsize(j, npages, off, len))) + xfsize(j, npages, off, len))) { + SFSTAT_INC(sf_pages_valid); break; + } /* * Now we got region of invalid pages between 'i' and 'j'. @@ -2220,16 +2223,20 @@ sendfile_swapin(vm_object_t obj, struct } } + SFSTAT_INC(sf_iocnt); + if (j > npages) { + SFSTAT_ADD(sf_pages_read, npages - i); + SFSTAT_ADD(sf_rhpages_read, j - npages); + } else + SFSTAT_ADD(sf_pages_read, count); + + nios++; refcount_acquire(&sfio->nios); rv = vm_pager_get_pages_async(obj, pa + i, count, NULL, NULL, &sf_iodone, sfio); - KASSERT(rv == VM_PAGER_OK, ("%s: pager fail obj %p page %p", __func__, obj, pa[i])); - SFSTAT_INC(sf_iocnt); - nios++; - for (j = i; j < i + count && j < npages; j++) KASSERT(pa[j] == vm_page_lookup(obj, OFF_TO_IDX(vmoff(j, off))), @@ -2241,6 +2248,9 @@ sendfile_swapin(vm_object_t obj, struct VM_OBJECT_WUNLOCK(obj); + if (nios == 0 && npages != 0) + SFSTAT_INC(sf_noiocnt); + return (nios); } @@ -2372,18 +2382,21 @@ vn_sendfile(struct file *fp, int sockfd, if (error != 0) goto out; - if (flags & SF_SYNC) { - sfs = malloc(sizeof *sfs, M_TEMP, M_WAITOK | M_ZERO); - mtx_init(&sfs->mtx, "sendfile", NULL, MTX_DEF); - cv_init(&sfs->cv, "sendfile"); - } - #ifdef MAC error = mac_socket_check_send(td->td_ucred, so); if (error != 0) goto out; #endif + SFSTAT_INC(sf_syscalls); + SFSTAT_ADD(sf_rhpages_requested, SF_READAHEAD(flags)); + + if (flags & SF_SYNC) { + sfs = malloc(sizeof *sfs, M_TEMP, M_WAITOK | M_ZERO); + mtx_init(&sfs->mtx, "sendfile", NULL, MTX_DEF); + cv_init(&sfs->cv, "sendfile"); + } + /* If headers are specified copy them into mbufs. */ if (hdr_uio != NULL && hdr_uio->uio_resid > 0) { hdr_uio->uio_td = td; Modified: projects/sendfile/sys/sys/sf_buf.h ============================================================================== --- projects/sendfile/sys/sys/sf_buf.h Wed Dec 16 22:26:28 2015 (r292379) +++ projects/sendfile/sys/sys/sf_buf.h Wed Dec 16 22:34:41 2015 (r292380) @@ -31,7 +31,13 @@ #define _SYS_SF_BUF_H_ struct sfstat { /* sendfile statistics */ + uint64_t sf_syscalls; /* times sendfile was called */ + uint64_t sf_noiocnt; /* times sendfile didn't require I/O */ uint64_t sf_iocnt; /* times sendfile had to do disk I/O */ + uint64_t sf_pages_read; /* pages read as part of a request */ + uint64_t sf_pages_valid; /* pages were valid for a request */ + uint64_t sf_rhpages_requested; /* readahead pages requested */ + uint64_t sf_rhpages_read; /* readahead pages read */ uint64_t sf_allocfail; /* times sfbuf allocation failed */ uint64_t sf_allocwait; /* times sfbuf allocation had to wait */ }; Modified: projects/sendfile/usr.bin/netstat/mbuf.c ============================================================================== --- projects/sendfile/usr.bin/netstat/mbuf.c Wed Dec 16 22:26:28 2015 (r292379) +++ projects/sendfile/usr.bin/netstat/mbuf.c Wed Dec 16 22:34:41 2015 (r292380) @@ -326,13 +326,30 @@ mbpr(void *kvmd, u_long mbaddr) kread_counters) != 0) goto out; + xo_emit("{:sendfile-syscalls/%ju} {N:sendfile syscalls}\n", + (uintmax_t)sfstat.sf_syscalls); + xo_emit("{:sendfile-no-io/%ju} " + "{N:sendfile syscalls completed without I\\/O request}\n", + (uintmax_t)sfstat.sf_noiocnt); + xo_emit("{:sendfile-io-count/%ju} " + "{N:requests for I\\/O initiated by sendfile}\n", + (uintmax_t)sfstat.sf_iocnt); + xo_emit("{:sendfile-pages-sent/%ju} " + "{N:pages read by sendfile as part of a request}\n", + (uintmax_t)sfstat.sf_pages_read); + xo_emit("{:sendfile-pages-valid/%ju} " + "{N:pages were valid at time of a sendfile request}\n", + (uintmax_t)sfstat.sf_pages_valid); + xo_emit("{:sendfile-requested-readahead/%ju} " + "{N:pages were requested for read ahead by applications}\n", + (uintmax_t)sfstat.sf_rhpages_requested); + xo_emit("{:sendfile-readahead/%ju} " + "{N:pages were read ahead by sendfile}\n", + (uintmax_t)sfstat.sf_rhpages_read); xo_emit("{:sfbufs-alloc-failed/%ju} {N:requests for sfbufs denied}\n", (uintmax_t)sfstat.sf_allocfail); xo_emit("{:sfbufs-alloc-wait/%ju} {N:requests for sfbufs delayed}\n", (uintmax_t)sfstat.sf_allocwait); - xo_emit("{:sfbufs-io-count/%ju} " - "{N:requests for I\\/O initiated by sendfile}\n", - (uintmax_t)sfstat.sf_iocnt); out: xo_close_container("mbuf-statistics"); memstat_mtl_free(mtlp);