Print this page
OS-5483 iostat -x shows around 100% utilization for idle zone
Reviewed by: Joshua M. Clulow <jmc@joyent.com>
Reviewed by: Patrick Mooney <patrick.mooney@joyent.com>
Reviewed by: Jerry Jelinek <jerry.jelinek@joyent.com>
Approved by: Robert Mustacchi <rm@joyent.com>
OS-5148 ftruncate at offset should emit proper events
Reviewed by: Bryan Cantrill <bryan@joyent.com>
Reviewed by: Jerry Jelinek <jerry.jelinek@joyent.com>
OS-338 Kstat counters to show "slow" VFS operations
OS-3294 add support for inotify
Reviewed by: Jerry Jelinek <jerry.jelinek@joyent.com>
Reviewed by: Robert Mustacchi <rm@joyent.com>
*** 19,29 ****
* CDDL HEADER END
*/
/*
* Copyright (c) 1988, 2010, Oracle and/or its affiliates. All rights reserved.
! * Copyright (c) 2013, Joyent, Inc. All rights reserved.
*/
/* Copyright (c) 1983, 1984, 1985, 1986, 1987, 1988, 1989 AT&T */
/* All Rights Reserved */
--- 19,29 ----
* CDDL HEADER END
*/
/*
* Copyright (c) 1988, 2010, Oracle and/or its affiliates. All rights reserved.
! * Copyright (c) 2014, Joyent, Inc. All rights reserved.
*/
/* Copyright (c) 1983, 1984, 1985, 1986, 1987, 1988, 1989 AT&T */
/* All Rights Reserved */
*** 198,207 ****
--- 198,211 ----
vfs_t *vfsp = (vp)->v_vfsp; \
if (vfsp != NULL && (vfsp->vfs_flag & VFS_XID) == 0) \
cr = crgetmapped(cr); \
}
+ #define VOP_LATENCY_10MS 10000000
+ #define VOP_LATENCY_100MS 100000000
+ #define VOP_LATENCY_1S 1000000000
+
/*
* Convert stat(2) formats to vnode types and vice versa. (Knows about
* numerical order of S_IFMT and vnode types.)
*/
enum vtype iftovt_tab[] = {
*** 2514,2523 ****
--- 2518,2528 ----
vnevent_rename_src(vnode_t *vp, vnode_t *dvp, char *name, caller_context_t *ct)
{
if (vp == NULL || vp->v_femhead == NULL) {
return;
}
+ (void) VOP_VNEVENT(dvp, VE_RENAME_SRC_DIR, vp, name, ct);
(void) VOP_VNEVENT(vp, VE_RENAME_SRC, dvp, name, ct);
}
void
vnevent_rename_dest(vnode_t *vp, vnode_t *dvp, char *name,
*** 2528,2543 ****
}
(void) VOP_VNEVENT(vp, VE_RENAME_DEST, dvp, name, ct);
}
void
! vnevent_rename_dest_dir(vnode_t *vp, caller_context_t *ct)
{
if (vp == NULL || vp->v_femhead == NULL) {
return;
}
! (void) VOP_VNEVENT(vp, VE_RENAME_DEST_DIR, NULL, NULL, ct);
}
void
vnevent_remove(vnode_t *vp, vnode_t *dvp, char *name, caller_context_t *ct)
{
--- 2533,2549 ----
}
(void) VOP_VNEVENT(vp, VE_RENAME_DEST, dvp, name, ct);
}
void
! vnevent_rename_dest_dir(vnode_t *vp, vnode_t *nvp, char *name,
! caller_context_t *ct)
{
if (vp == NULL || vp->v_femhead == NULL) {
return;
}
! (void) VOP_VNEVENT(vp, VE_RENAME_DEST_DIR, nvp, name, ct);
}
void
vnevent_remove(vnode_t *vp, vnode_t *dvp, char *name, caller_context_t *ct)
{
*** 2620,2629 ****
--- 2626,2644 ----
return;
}
(void) VOP_VNEVENT(vp, VE_TRUNCATE, NULL, NULL, ct);
}
+ void
+ vnevent_resize(vnode_t *vp, caller_context_t *ct)
+ {
+ if (vp == NULL || vp->v_femhead == NULL) {
+ return;
+ }
+ (void) VOP_VNEVENT(vp, VE_RESIZE, NULL, NULL, ct);
+ }
+
/*
* Vnode accessors.
*/
int
*** 3259,3276 ****
uio_t *uiop,
int ioflag,
cred_t *cr,
caller_context_t *ct)
{
- int err;
ssize_t resid_start = uiop->uio_resid;
VOPXID_MAP_CR(vp, cr);
err = (*(vp)->v_op->vop_read)(vp, uiop, ioflag, cr, ct);
! VOPSTATS_UPDATE_IO(vp, read,
! read_bytes, (resid_start - uiop->uio_resid));
return (err);
}
int
fop_write(
--- 3274,3330 ----
uio_t *uiop,
int ioflag,
cred_t *cr,
caller_context_t *ct)
{
ssize_t resid_start = uiop->uio_resid;
+ zone_t *zonep = curzone;
+ zone_vfs_kstat_t *zvp = zonep->zone_vfs_stats;
+ hrtime_t start = 0, lat;
+ ssize_t len;
+ int err;
+
+ if ((vp->v_type == VREG || vp->v_type == VDIR || vp->v_type == VBLK) &&
+ vp->v_vfsp != NULL && (vp->v_vfsp->vfs_flag & VFS_STATS)) {
+ start = gethrtime();
+
+ mutex_enter(&zonep->zone_vfs_lock);
+ kstat_runq_enter(&zonep->zone_vfs_rwstats);
+ mutex_exit(&zonep->zone_vfs_lock);
+ }
+
VOPXID_MAP_CR(vp, cr);
err = (*(vp)->v_op->vop_read)(vp, uiop, ioflag, cr, ct);
! len = resid_start - uiop->uio_resid;
!
! VOPSTATS_UPDATE_IO(vp, read, read_bytes, len);
!
! if (start != 0) {
! mutex_enter(&zonep->zone_vfs_lock);
! zonep->zone_vfs_rwstats.reads++;
! zonep->zone_vfs_rwstats.nread += len;
! kstat_runq_exit(&zonep->zone_vfs_rwstats);
! mutex_exit(&zonep->zone_vfs_lock);
!
! lat = gethrtime() - start;
!
! if (lat >= VOP_LATENCY_10MS) {
! if (lat < VOP_LATENCY_100MS)
! atomic_inc_64(&zvp->zv_10ms_ops.value.ui64);
! else if (lat < VOP_LATENCY_1S) {
! atomic_inc_64(&zvp->zv_10ms_ops.value.ui64);
! atomic_inc_64(&zvp->zv_100ms_ops.value.ui64);
! } else {
! atomic_inc_64(&zvp->zv_10ms_ops.value.ui64);
! atomic_inc_64(&zvp->zv_100ms_ops.value.ui64);
! atomic_inc_64(&zvp->zv_1s_ops.value.ui64);
! }
! }
! }
!
return (err);
}
int
fop_write(
*** 3278,3295 ****
uio_t *uiop,
int ioflag,
cred_t *cr,
caller_context_t *ct)
{
- int err;
ssize_t resid_start = uiop->uio_resid;
VOPXID_MAP_CR(vp, cr);
err = (*(vp)->v_op->vop_write)(vp, uiop, ioflag, cr, ct);
! VOPSTATS_UPDATE_IO(vp, write,
! write_bytes, (resid_start - uiop->uio_resid));
return (err);
}
int
fop_ioctl(
--- 3332,3393 ----
uio_t *uiop,
int ioflag,
cred_t *cr,
caller_context_t *ct)
{
ssize_t resid_start = uiop->uio_resid;
+ zone_t *zonep = curzone;
+ zone_vfs_kstat_t *zvp = zonep->zone_vfs_stats;
+ hrtime_t start = 0, lat;
+ ssize_t len;
+ int err;
+
+ /*
+ * For the purposes of VFS kstat consumers, the "waitq" calculation is
+ * repurposed as the active queue for VFS write operations. There's no
+ * actual wait queue for VFS operations.
+ */
+ if ((vp->v_type == VREG || vp->v_type == VDIR || vp->v_type == VBLK) &&
+ vp->v_vfsp != NULL && (vp->v_vfsp->vfs_flag & VFS_STATS)) {
+ start = gethrtime();
+
+ mutex_enter(&zonep->zone_vfs_lock);
+ kstat_waitq_enter(&zonep->zone_vfs_rwstats);
+ mutex_exit(&zonep->zone_vfs_lock);
+ }
+
VOPXID_MAP_CR(vp, cr);
err = (*(vp)->v_op->vop_write)(vp, uiop, ioflag, cr, ct);
! len = resid_start - uiop->uio_resid;
!
! VOPSTATS_UPDATE_IO(vp, write, write_bytes, len);
!
! if (start != 0) {
! mutex_enter(&zonep->zone_vfs_lock);
! zonep->zone_vfs_rwstats.writes++;
! zonep->zone_vfs_rwstats.nwritten += len;
! kstat_waitq_exit(&zonep->zone_vfs_rwstats);
! mutex_exit(&zonep->zone_vfs_lock);
!
! lat = gethrtime() - start;
!
! if (lat >= VOP_LATENCY_10MS) {
! if (lat < VOP_LATENCY_100MS)
! atomic_inc_64(&zvp->zv_10ms_ops.value.ui64);
! else if (lat < VOP_LATENCY_1S) {
! atomic_inc_64(&zvp->zv_10ms_ops.value.ui64);
! atomic_inc_64(&zvp->zv_100ms_ops.value.ui64);
! } else {
! atomic_inc_64(&zvp->zv_10ms_ops.value.ui64);
! atomic_inc_64(&zvp->zv_100ms_ops.value.ui64);
! atomic_inc_64(&zvp->zv_1s_ops.value.ui64);
! }
! }
! }
!
return (err);
}
int
fop_ioctl(