|
Lines 193-201
extern int zfs_prefetch_disable;
Link Here
|
| 193 |
*/ |
193 |
*/ |
| 194 |
static boolean_t arc_warm; |
194 |
static boolean_t arc_warm; |
| 195 |
|
195 |
|
| 196 |
/* |
|
|
| 197 |
* These tunables are for performance analysis. |
| 198 |
*/ |
| 199 |
uint64_t zfs_arc_max; |
196 |
uint64_t zfs_arc_max; |
| 200 |
uint64_t zfs_arc_min; |
197 |
uint64_t zfs_arc_min; |
| 201 |
uint64_t zfs_arc_meta_limit = 0; |
198 |
uint64_t zfs_arc_meta_limit = 0; |
|
Lines 204-210
int zfs_arc_shrink_shift = 0;
Link Here
|
| 204 |
int zfs_arc_p_min_shift = 0; |
201 |
int zfs_arc_p_min_shift = 0; |
| 205 |
int zfs_disable_dup_eviction = 0; |
202 |
int zfs_disable_dup_eviction = 0; |
| 206 |
uint64_t zfs_arc_average_blocksize = 8 * 1024; /* 8KB */ |
203 |
uint64_t zfs_arc_average_blocksize = 8 * 1024; /* 8KB */ |
|
|
204 |
u_int zfs_arc_free_target = (1 << 19); /* default before pagedaemon init only */ |
| 207 |
|
205 |
|
|
|
206 |
static int sysctl_vfs_zfs_arc_free_target(SYSCTL_HANDLER_ARGS); |
| 207 |
|
| 208 |
#ifdef _KERNEL |
| 209 |
static void |
| 210 |
arc_free_target_init(void *unused __unused) |
| 211 |
{ |
| 212 |
|
| 213 |
zfs_arc_free_target = kmem_free_target(); |
| 214 |
} |
| 215 |
SYSINIT(arc_free_target_init, SI_SUB_KTHREAD_PAGE, SI_ORDER_ANY, |
| 216 |
arc_free_target_init, NULL); |
| 217 |
#endif |
| 218 |
|
| 208 |
TUNABLE_QUAD("vfs.zfs.arc_meta_limit", &zfs_arc_meta_limit); |
219 |
TUNABLE_QUAD("vfs.zfs.arc_meta_limit", &zfs_arc_meta_limit); |
| 209 |
SYSCTL_DECL(_vfs_zfs); |
220 |
SYSCTL_DECL(_vfs_zfs); |
| 210 |
SYSCTL_UQUAD(_vfs_zfs, OID_AUTO, arc_max, CTLFLAG_RDTUN, &zfs_arc_max, 0, |
221 |
SYSCTL_UQUAD(_vfs_zfs, OID_AUTO, arc_max, CTLFLAG_RDTUN, &zfs_arc_max, 0, |
|
Lines 214-220
SYSCTL_UQUAD(_vfs_zfs, OID_AUTO, arc_min, CTLFLAG_
Link Here
|
| 214 |
SYSCTL_UQUAD(_vfs_zfs, OID_AUTO, arc_average_blocksize, CTLFLAG_RDTUN, |
225 |
SYSCTL_UQUAD(_vfs_zfs, OID_AUTO, arc_average_blocksize, CTLFLAG_RDTUN, |
| 215 |
&zfs_arc_average_blocksize, 0, |
226 |
&zfs_arc_average_blocksize, 0, |
| 216 |
"ARC average blocksize"); |
227 |
"ARC average blocksize"); |
|
|
228 |
/* |
| 229 |
* We don't have a tunable for arc_free_target due to the dependency on |
| 230 |
* pagedaemon initialisation. |
| 231 |
*/ |
| 232 |
SYSCTL_PROC(_vfs_zfs, OID_AUTO, arc_free_target, |
| 233 |
CTLTYPE_UINT | CTLFLAG_MPSAFE | CTLFLAG_RW, 0, sizeof(u_int), |
| 234 |
sysctl_vfs_zfs_arc_free_target, "IU", |
| 235 |
"Desired number of free pages below which ARC triggers reclaim"); |
| 217 |
|
236 |
|
|
|
237 |
static int |
| 238 |
sysctl_vfs_zfs_arc_free_target(SYSCTL_HANDLER_ARGS) |
| 239 |
{ |
| 240 |
u_int val; |
| 241 |
int err; |
| 242 |
|
| 243 |
val = zfs_arc_free_target; |
| 244 |
err = sysctl_handle_int(oidp, &val, 0, req); |
| 245 |
if (err != 0 || req->newptr == NULL) |
| 246 |
return (err); |
| 247 |
|
| 248 |
if (val < kmem_free_min()) |
| 249 |
return (EINVAL); |
| 250 |
if (val > kmem_page_count()) |
| 251 |
return (EINVAL); |
| 252 |
|
| 253 |
zfs_arc_free_target = val; |
| 254 |
|
| 255 |
return (0); |
| 256 |
} |
| 257 |
|
| 218 |
/* |
258 |
/* |
| 219 |
* Note that buffers can be in one of 6 states: |
259 |
* Note that buffers can be in one of 6 states: |
| 220 |
* ARC_anon - anonymous (discussed below) |
260 |
* ARC_anon - anonymous (discussed below) |
|
Lines 2418-2426
arc_flush(spa_t *spa)
Link Here
|
| 2418 |
void |
2458 |
void |
| 2419 |
arc_shrink(void) |
2459 |
arc_shrink(void) |
| 2420 |
{ |
2460 |
{ |
|
|
2461 |
|
| 2421 |
if (arc_c > arc_c_min) { |
2462 |
if (arc_c > arc_c_min) { |
| 2422 |
uint64_t to_free; |
2463 |
uint64_t to_free; |
| 2423 |
|
2464 |
|
|
|
2465 |
DTRACE_PROBE2(arc__shrink, uint64_t, arc_c, uint64_t, |
| 2466 |
arc_c_min); |
| 2424 |
#ifdef _KERNEL |
2467 |
#ifdef _KERNEL |
| 2425 |
to_free = arc_c >> arc_shrink_shift; |
2468 |
to_free = arc_c >> arc_shrink_shift; |
| 2426 |
#else |
2469 |
#else |
|
Lines 2440-2447
arc_shrink(void)
Link Here
|
| 2440 |
ASSERT((int64_t)arc_p >= 0); |
2483 |
ASSERT((int64_t)arc_p >= 0); |
| 2441 |
} |
2484 |
} |
| 2442 |
|
2485 |
|
| 2443 |
if (arc_size > arc_c) |
2486 |
if (arc_size > arc_c) { |
|
|
2487 |
DTRACE_PROBE2(arc__shrink_adjust, uint64_t, arc_size, |
| 2488 |
uint64_t, arc_c); |
| 2444 |
arc_adjust(); |
2489 |
arc_adjust(); |
|
|
2490 |
} |
| 2445 |
} |
2491 |
} |
| 2446 |
|
2492 |
|
| 2447 |
static int needfree = 0; |
2493 |
static int needfree = 0; |
|
Lines 2452-2466
arc_reclaim_needed(void)
Link Here
|
| 2452 |
|
2498 |
|
| 2453 |
#ifdef _KERNEL |
2499 |
#ifdef _KERNEL |
| 2454 |
|
2500 |
|
| 2455 |
if (needfree) |
2501 |
if (needfree) { |
|
|
2502 |
DTRACE_PROBE(arc__reclaim_needfree); |
| 2456 |
return (1); |
2503 |
return (1); |
|
|
2504 |
} |
| 2457 |
|
2505 |
|
|
|
2506 |
if (kmem_free_count() < zfs_arc_free_target) { |
| 2507 |
DTRACE_PROBE2(arc__reclaim_freetarget, uint64_t, |
| 2508 |
kmem_free_count(), uint64_t, zfs_arc_free_target); |
| 2509 |
return (1); |
| 2510 |
} |
| 2511 |
|
| 2458 |
/* |
2512 |
/* |
| 2459 |
* Cooperate with pagedaemon when it's time for it to scan |
2513 |
* Cooperate with pagedaemon when it's time for it to scan |
| 2460 |
* and reclaim some pages. |
2514 |
* and reclaim some pages. |
| 2461 |
*/ |
2515 |
*/ |
| 2462 |
if (vm_paging_needed()) |
2516 |
if (vm_paging_needed()) { |
|
|
2517 |
DTRACE_PROBE(arc__reclaim_paging); |
| 2463 |
return (1); |
2518 |
return (1); |
|
|
2519 |
} |
| 2464 |
|
2520 |
|
| 2465 |
#ifdef sun |
2521 |
#ifdef sun |
| 2466 |
/* |
2522 |
/* |
|
Lines 2504-2512
arc_reclaim_needed(void)
Link Here
|
| 2504 |
(btop(vmem_size(heap_arena, VMEM_FREE | VMEM_ALLOC)) >> 2)) |
2560 |
(btop(vmem_size(heap_arena, VMEM_FREE | VMEM_ALLOC)) >> 2)) |
| 2505 |
return (1); |
2561 |
return (1); |
| 2506 |
#endif |
2562 |
#endif |
| 2507 |
#else /* !sun */ |
|
|
| 2508 |
if (kmem_used() > (kmem_size() * 3) / 4) |
| 2509 |
return (1); |
| 2510 |
#endif /* sun */ |
2563 |
#endif /* sun */ |
| 2511 |
|
2564 |
|
| 2512 |
#else |
2565 |
#else |
|
Lines 2513-2518
arc_reclaim_needed(void)
Link Here
|
| 2513 |
if (spa_get_random(100) == 0) |
2566 |
if (spa_get_random(100) == 0) |
| 2514 |
return (1); |
2567 |
return (1); |
| 2515 |
#endif |
2568 |
#endif |
|
|
2569 |
DTRACE_PROBE(arc__reclaim_no); |
| 2570 |
|
| 2516 |
return (0); |
2571 |
return (0); |
| 2517 |
} |
2572 |
} |
| 2518 |
|
2573 |
|