IRIX 6.5 » Books » Administrative »
IRIX Admin: System Configuration and Operation
(document number: 007-2859-021 / published: 2003-04-29)
table of contents | additional info | download
find in page
This appendix describes the tunable parameters that define kernel structures. These structures keep track of processes, files, and system activity. Many of the parameter values are specified in the files found in /var/sysgen/mtune and /var/sysgen/master.d.
If the system does not respond favorably to your tuning changes, you may want to return to your original configuration or continue making changes to related parameters. An unfavorable response to your tuning changes can be as minor as the system not gaining the hoped-for speed or capacity, or as major as the system becoming unable to boot or run. This generally occurs when parameters are changed to a great degree. Simply maximizing a particular parameter without regard for related parameters can upset the balance of the system to the point of inoperability. For complete information on the proper procedure for tuning your operating system, read Chapter 10, “System Performance Tuning”.
The rest of this appendix describes the more important tunable parameters according to function. Related parameters are grouped into sections. These sections include:
General tunable parameters. See “ General Parameters”.
System limits tunable parameters. See “ System Limits Parameters”.
Resource limits tunable parameters. See “ Resource Limits Parameters”.
Paging tunable parameters. See “ Paging Parameters”.
IPC tunable parameters–including interprocess communication messages, semaphores, and shared memory. See “IPC Parameters”, “IPC Messages Parameters”, “IPC Semaphores Parameters”, and “IPC Shared Memory Parameters”.
Streams tunable parameters. See “Streams Parameters”.
Signal parameters. See “Signal Parameter”.
Dispatch parameters. See “Dispatch Parameters”.
Extent File System (EFS) parameters. See “Filesystem Parameters”.
Loadable driver parameters. See “Loadable Drivers Parameters”.
CPU actions parameters. See “CPU Action Parameter”.
Switch parameters. See “Switch Parameters”.
Timer parameters. See “Timer Parameters”.
Network File System (NFS) parameters. See “NFS Parameters”.
Socket parameters. See “Socket Parameters”.
Indy Video parameters. See “VINO Parameter”.
Large page parameters. See “Large Page Parameters”.
Extended accounting parameters. See “Extended Accounting Parameters”.
NUMA parameters. See “NUMA Parameters”.
Page replication parameters. See “Page Replication Parameter”.
Migration memory queue parameters. See “Migration Memory Queue Parameters”.
XVM parameters. See “XVM Parameters”.
CXFS parameters. See “CXFS Parameters”.
Core file parameters. See “Core File Parameter”.
Each section begins with a short description of the activities controlled by the parameters in that section, and each listed parameter has a description that may include the following parts:
| Name | Specifies the name of the parameter. | |
| Description | Provides a description of the parameter, including the file in which the parameter is specified, and the formula, if applicable. | |
| Value | Gives the default setting and, if applicable, a range. Note that the value given for each parameter is usually appropriate for a single-user graphics workstation. Values may be presented in either hex or decimal notation. | |
| When to Change | Discusses the conditions under which it is appropriate to change the parameter. | |
| Notes | Covers other pertinent information, such as error messages. |
Note that the tunable parameters are subject to change with each release of the system.
The following group of tunable parameters specifies the size of various system structures. These are the parameters you will most likely change when you tune a system.
cachefs_readahead specifies the number of readahead blocks for the filesystem.
cachefs_max_threads specifies the maximum number of asynchronous I/O daemons per cachefs mount.
nbuf specifies the number of buffer headers in the filesystem buffer cache.
min_bufmem specifies the minimum amount of memory held by filesystem metadata that is cached in the buffer cache when the system runs into low memory conditions.
nproc specifies the number of user processes allowed at any given time.
syssegsz specifies the maximum number of pages of dynamic system memory.
mbmaxpages specifies the maximum number of one-page clusters used in network buffers.
ecc_recover_enable specifies the system response to multibit errors.
utrace_bufsize selects the number of 48 byte utrace entries stored for each CPU.
buf_relse_age specifies when a buffer cache page needs to be released.
| Description | The maxpmem parameter specifies the amount of physical memory (in pages) that the system can recognize. The page size is 4 KB for 32 bit IRIX version 5 or 6 kernels and 16 KB for 64 bit IRIX version 6 kernels. If it is set to zero (0), the system will use all available pages in memory. A value other than zero defines the physical memory size (in pages) that the system will recognize. This parameter is defined in /var/sysgen/mtune. | ||
| Value | Default: 0 (Automatically configured if set to 0) Range: 1024 pages—total amount of memory | ||
| When to Change | You do not need to change this parameter, except when benchmarks require a specific system memory size less than the physical memory size of the system. This is primarily useful to kernel developers. You can also boot the system with this command added on the boot command line to achieve the same effect:
|
| Description | The syssegez parameter specifies the maximum number of pages of dynamic system memory. | |
| Value | Default: 0 (Autoconfigured if set to 0) 32-bit Range: 0x2000 - 0x20000 64-bit Range: 0x2000 - 0x10000000 | |
| When to Change | Increase this parameter correspondingly when maxdmasz is increased, or when you install a kernel driver that performs a lot of dynamic memory allocation. The recommended initial value for large (64 processors or greater) systems is 0xfe800. |
| Description | The maxdmasz parameter specifies the maximum DMA transfer expressed in pages of memory. This amount must be less than the value of syssegsz and maxpmem. | |
| Value | Default: 1025 (32-bit kernels) Default: 257 (64-bit kernels) 32-bit Range: 1 - syssegsz (maximum 0x20000) 64-bit Range: 1 - syssegsz (maximum 0x10000000) | |
| When to Change | Change this parameter when you need to be able to use very large read or write system calls, or other system calls that perform large scale DMA. This situation typically arises when using optical scanners, film recorders or some printers. Note that the actual DMA transfer size is one less page than the number of pages set in this parameter. Thus, to allow a full DMA transfer of 16 MB (1024 pages), set this parameter to 1025. The recommended initial value for large (64 processors or greater) systems is 0x2001. |
| Description | The mbmaxpages parameter specifies the maximum number of single page clusters that can be allocated to network buffers. This limits the total memory that network buffers (mbufs) can consume. | |
| Value | Default: 1/4 of physical memory Range: Default - Total System Memory (in pages) | |
| When to Change | For most workstations and small servers the default is sufficient. For very large systems, larger values are appropriate. A 0 value tells the kernel to set the value (1/4 of physical memory) based on the amount of physical memory configured in the hardware. The minimum that can be set with the systune command is 16 pages. The maximum is 8192 pages for 32-bit systems and 2097152 pages for 64-bit systems. |
| Description | The ecc_recover_enable parameter, when set to 0, directs the system not to attempt to recover from multibit errors. If it is set greater than 0, the parameter value is taken as a number of seconds. The system is directed to attempt recovery, but not in the event of more than 32 errors in each number of seconds specified by this parameter. | |
| Value | Default: 60 seconds (0x3c) |
| Description | utraces are a lightweight tracing mechanism used to collect kernel debugging information. The utrace_bufsize parameter selects the number of 48 byte utrace entries stored for each CPU. Setting this parameter to 0 disables trace collection. Only buffer sizes of 0 and 2048 are supported. | |
| Value | Default: 0 Range: 0-0x7fffffff |
| Description | The dump_level parameter specifies the dump level and controls the data dumped in a system crash. Setting this parameter to 0 dumps only putbuf,errbuf, and low memory during a panic. 1 also dumps static, dynamic, and backtrace kernel pages along with pfdats (if applicable); 2 also dumps buffer cache pages; 3 also dump remaining in-use pages; and 4 also dumps free pages. | |
| Value | Default: 0 Range: 0-4 The recommended initial value for large (64 processors or greater) systems is 3. |
| Description | The buf_relse_age parameter specifies when a buffer cache page needs to be released. If a file's data had been untouched for at least buf_relse_age seconds, then the data is released. This run-time settable variable may be useful in systems in which some nodes have plenty of free memory and others have consumed all local memory. If the latter contains a lot of very aged buffer cache data, the normal buffer releasing system may not release the data because the system looks at memory globally and does not distinguish memory per node. | |
| Value | Default: 0 (0 means the feature is not used.) Range: 0-0x7fffffff seconds | |
| When to Change | A recommended setting is difficult to provide as the load and needs of every system are different. Any setting under 30 seconds is too aggressive, and any under 10 seconds causes a lot of thrashing. A workable solution is to set buf_relse_age to 600 seconds (5 minutes), to study the displays of the bufview and osview commands over time in order to observe how much memory is available, and then to adjust the buf_relse_age value up or down until it appears to be satisfactory. |
The IRIX system has configurable parameters for certain system limits. For example, you can set maximum values for each process (its core or file size), the number of groups per user, the number of resident pages, and so forth. These parameters are listed below. All parameters are set and defined in /var/sysgen/mtune/kernel.
| Description | The maxup parameter defines the number of processes allowed per user login. This value should always be at least 20 less than nproc. | |
| Value | Default: 150 processes Range: 15–30000 (but never more than nproc minus 20) | |
| When to Change | Increase this parameter to allow more processes per user. In a heavily loaded time-sharing environment, you may want to decrease the value to reduce the number of processes per user. The recommended initial value for large (64 processors or greater) systems is 8000. |
| Description | The ngroups_max parameter specifies the maximum number of multiple groups to which a user may simultaneously belong. The constants NGROUPS_UMIN <= ngroups_max <= NGROUPS_UMAX are defined in </usr/include/sys/param.h>. NGROUPS_UMIN is the minimum number of multiple groups that can be selected at lboot time. NGROUPS_UMAX is the maximum number of multiple groups that can be selected at lboot time and is the number of group-id slots for which space is set aside at compile time. NGROUPS, which is present for compatibility with networking code (defined in </usr/include/sys/param.h>), must not be larger than ngroups_max. | |
| Value | Default: 16 Range: 0-32 | |
| When to Change | The default value is adequate for most systems. Increase this parameter if your system has users who need simultaneous access to more than 16 groups. |
| Description | The maxwatchpoints parameter sets the maximum number of watchpoints per process. Watchpoints are set and used via the proc(4) filesystem. This parameter specifies the maximum number of virtual address segments to be watched in the traced process. This is typically used by debuggers. | |
| Value | Default: 100 Range: 1-1000 | |
| When to Change | Raise maxwatchpoints if your debugger is running out of watchpoints. |
| Description | The nprofile parameter specifies the maximum number of disjoint text spaces that can be profiled using the sprofil(2) system call. This is useful if you need to profile programs using shared libraries or profile an address space using different granularities for different sections of text. | |
| Value | Default: 100 Range: 100-10000 | |
| When to Change | Change nprofile if you need to profile more text spaces than are currently configured. |
| Description | The maxsymlinks parameter defines the maximum number of symbolic links that will be followed during filename lookups (for example, during the open(2) or stat(2) system calls) before ceasing the lookup. This limit is required to prevent loops where a chain of symbolic links points back to the original filename. | |
| Value | Default: 30 Range: 0-50 | |
| When to Change | Change this parameter if you have pathnames with more than 30 symbolic links. |
You can set numerous limits on a per-process basis by using getrlimit(2), setrlimit(2), and limit, the shell built-in command. These limits are inherited, and the original values are set in /var/sysgen/mtune. These limits are different from the system limits listed above in that they apply only to the current process and any child processes that may be spawned. To achieve similar effects, you can also use the limit command within the Bourne, C, and Korn shells (/bin/sh, /bin/csh, and /bin/ksh). For additional information on resource limits, see IRIX Admin: Resource Administration.
Each limit has a default and a maximum. Only the superuser can change the maximum. Each resource can have a value that turns off any checking. The default values are adequate for most systems.
| Note: Resource limit values (rlim_t) are 64-bit in both n32 and n64 binaries. Consequently, n32 binaries can set 64-bit limits. o32 binaries cannot set 64-bit limits because rlim_t is 32-bits in o32 binaries. IRIX supports three Application Binary Interfaces (ABIs): o32, n64, and n32 (for more information on ABIs, see the abi(5) man page). |
The following parameters are associated with system resource limits:
ncargs specifies the number of bytes of arguments that may be passed during an exec(2) call.
rlimit_core_max specifies the maximum value rlimit_core_cur may hold.
rlimit_cpu_cur specifies the limit for current CPU time available to a process.
rlimit_cpu_max specifies the maximum value rlimit_cpu_cur may hold.
rlimit_data_cur specifies the current amount of data space available to a process.
rlimit_data_max specifies the maximum value rlimit_data_cur may hold.
rlimit_fsize_cur specifies the current file size available to a process.
rlimit_fsize_max specifies the maximum value rlimit_fsize_cur may hold.
rlimit_nofile_cur specifies the current number of file descriptors available to a process.
rlimit_nofile_max specifies the maximum value rlimit_nofile_cur may hold.
rlimit_pthread_cur specifies the current amount of threads that a process creates.
rlimit_pthread_max specifies the maximum value rlimit_pthread_cur may hold.
rlimit_rss_cur specifies the current resident set size available to a process.
rlimit_rss_max specifies the maximum value rlimit_rss_cur may hold.
rlimit_stack_cur specifies the current stack size for a process.
rlimit_stack_max specifies the maximum value rlimit_stack_cur may hold.
rlimit_vmem_cur specifies the current amount of virtual memory for a process.
rlimit_vmem_max specifies the maximum value rlimit_vmem_cur may hold.
rsshogfrac specifies the percentage of memory allotted for resident pages.
rsshogslop specifies the number of pages above the resident set maximum that a process may use.
shlbmax specifies the maximum number of shared libraries with which a process can link.
cpulimit_gracetime establishes a grace period for processes that exceed the cpu time limit.
| Description | The ncargs parameter specifies the maximum size of arguments in bytes that may be passed during an exec(2) system call. This parameter is specified in /var/sysgen/mtune. | ||
| Value | Default: 20480 Range: 5120–262144 | ||
| When to Change | The default value is adequate for most systems. Increase this parameter if you get the following message from exec(2), shell(1), or make(1):
| ||
| Notes | Setting this parameter too large wastes memory (although this memory is pageable) and may cause some programs to function incorrectly. Also note that some shells may have independent limits smaller than ncargs. |
| Description | The rlimit_core_max parameter specifies the maximum limit to the size of core image files. | |
| Value | Default: 0x7fffffffffffffff (9223372036854775807 bytes) Range: 0–0x7fffffffffffffff | |
| When to change | Change this parameter when you want to place a maximum restriction on core file size. rlimit_core_cur cannot be larger than this value. |
| Description | The rlimit_cpu_cur parameter specifies the current limit to the amount of CPU time in seconds that may be used in executing the process. | |
| Value | Default: 0x7fffffffffffffff (9223372036854775807 seconds) Range: 0–0x7fffffffffffffff | |
| When to change | Change this parameter when you want to place a cap on CPU usage. |
| Description | The rlimit_cpu_max parameter specifies the maximum limit to the amount of CPU time that may be used in executing a process. | |
| Value | Default: 0x7fffffffffffffff (9223372036854775807 minutes) Range: 0–0x7fffffffffffffff | |
| When to change | Change this parameter when you want to place a maximum restriction on general CPU usage. |
| Description | The rlimit_data_cur parameter specifies the current limit to the data size of the process. | |
| Value | Default: 0 (auto-configured to rlimit_vmem_cur * NBPP) (0x20000000) Range: 0–0x7fffffffffffffff | |
| When to change | Change this parameter when you want to place a cap on data segment size. The recommended initial value for large (64 processors or greater) systems is 0 ll. |
| Description | The rlimit_data_max parameter specifies the maximum limit to the size of data that may be used in executing a process. | |
| Value | Default: 0 (auto-configured to rlimit_vmem_cur * NBPP) (0x20000000) Range: 0–0x7fffffffffffffff | |
| When to change | Change this parameter when you want to place a maximum restriction on the size of the data segment of any process. The recommended initial value for large (64 processors or greater) systems is 0 ll. |
| Description | The rlimit_nofile_cur parameter specifies the current limit to the number of open file descriptors that may be used in executing the process. | |
| Value | Default: 200 Range: 40–0x7fffffffffffffff | |
| When to change | Change this parameter when you want to place a cap on the number of open file descriptors. |
| Description | The rlimit_nofile_max parameter specifies the maximum limit to the number of open file descriptors that may be used in executing a process. | |
| Value | Default: 2500 Range: 0–0x7fffffffffffffff | |
| When to change | Change this parameter when you want to place a maximum restriction on the number of open file descriptors. |
| Description | The rlimit_rss_cur parameter specifies the current limit to the resident set size (the number of pages of memory in use at any given time) that may be used in executing the process. This limit is the larger of the results of the following two formulae: physical_memory_size - 4 MB physical_memory_size * 9/10 | ||
| Value | Default: 0. If rlimit_rss_cur is 0, it is automatically configured to the larger of the following formulae:
Range: 0–0x7fffffffffffffff | ||
| When to change | Change this parameter when you want to place a cap on the resident set size of a process. The recommended initial value for large (64 processors or greater) systems is 0 ll. |
| Description | The rlimit_rss_max parameter specifies the maximum limit to the resident set size that may be used in executing a process. | ||
| Value | Default: 0. If rlimit_rss_max is 0, it is automatically configured to the larger of the following formulae:
Range: 0–0x7fffffffffffffff | ||
| When to change | Change this parameter when you want to place a maximum restriction on resident set size. The recommended initial value for large (64 processors or greater) systems is 0 ll. |
| Description | The rlimit_stack_cur parameter specifies the current limit to the amount of stack space that may be used in executing the process. | |
| Value | Default: 64 MB (0x04000000) Range: 0–0x7fffffffffffffff) | |
| When to change | Change this parameter when you want to place a limit on stack space usage. The recommended initial value for large (64 processors or greater) systems is (0x04000000) ll. |
| Description | The rlimit_stack_max parameter specifies the maximum limit to the amount of stack space that may be used in executing a process. | |
| Value | Default: rlimit_vmem_cur * NBPP (0x20000000) Range: 0–0x7fffffffffffffff | |
| When to change | Change this parameter when you want to place a maximum restriction on stack space usage. The recommended initial value for large (64 processors or greater) systems is (0x20000000) ll. |
| Description | The rlimit_vmem_cur parameter specifies the current limit to the amount of virtual memory that may be used in executing the process. | |
| Value | Default: 0. If rlimit_vmen_cur is 0, it is automatically configured to the following: 0x7fffffffffffffff for Origin 3000, Origin 2000, Challenge, O200, and Onyx2 systems 0x80000000 for Indgio 2, Power Indgio 2, Octane, and O2 systems 0x40000000 for smaller systems Range: 0–0x7fffffffffffffff | |
| When to change | Change this parameter when you want to place a cap on virtual memory usage. The recommended initial value for large (64 processors or greater) systems is 0 ll. |
| Description | The rlimit_vmem_max parameter specifies the maximum limit to the amount of virtual memory that may be used in executing a process. | |
| Value | Default: 0. If rlimit_vmen_max is 0, it is automatically configured to the following: 0x40000000 for smaller machines 0x80000000 for larger machines 0x7fffffffffffffff for the SN architecture Range: 0–0x7fffffffffffffff | |
| When to change | Change this parameter when you want to place a maximum restriction on virtual memory usage or if your swap space is larger than the current parameter value. The recommended initial value for large (64 processors or greater) systems is 0 ll. |
| Description | The rsshogfrac parameter specifies the percentage of memory allotted for resident pages. The number of physical memory pages occupied by a process at any given time is called its resident set size (RSS). The limit to the RSS of a process is determined by its allowable memory-use resource limit. rsshogfrac is designed to guarantee that even if one or more processes are exceeding their RSS limit, some percentage of memory is always kept free so that good interactive response is maintained. The percentage of total memory hogged is 100% minus rsshogfrac times maximum memory or 100 MB, whichever is less. Processes are permitted to exceed their RSS limit until either of the following occur:
| |
| Value | Default: 75% of total memory Range: 0–100% of total memory | |
| When to Change | The default value is adequate for most systems. The recommended initial value for large (64 processors or greater) systems is 99. |
| Description | The rsshogslop parameter specifies the number of pages above the resident set maximum that a process may use. To avoid thrashing (a condition where the computer devotes 100% of its CPU cycles to swapping and paging), a process can use up to rsshogslop more pages than its resident set maximum (see “ Resource Limits Parameters”). This parameter is specified in /var/sysgen/mtune. For more information, see the rsshogfrac resource limit. | |
| Value | Default: 20 | |
| When to Change | The default value is adequate for most systems. |
| Description | The shlbmax parameter specifies the maximum number of shared libraries with which a process can link. This parameter is specified in /var/sysgen/mtune. | ||
| Value | Default: 8 Range: 3–32 | ||
| When to Change | The default value is adequate for most systems. Increase this parameter if you see the following message from exec(2):
|
| Description | The cpulimit_gracetime parameter establishes a grace period for processes that exceed the cpu time limit. It is the number of seconds that a process is allowed to run after exceeding the limit set in the rlimit_cpu_cur parameter. When cpulimit_gracetime is not set (that is, it is zero), any process that exceeds either the process or job cpu limit is sent a SIGXCPU signal. The kernel continues to send SIGXCPU signals periodically as long as that process continues to execute. Since a process can register to handle SIGXCPU, the process can effectively ignore the CPU limit. If cpulimit_gracetime is set to a nonzero value via the systune(1M)command, the behavior changes. The kernel sends a SIGXCPU signal to a process one time when it exceeds the process cpu limit. The process can register for this signal and then perform any needed cleanup and shutdown operations. If the process is still running after accruing cpulimit_gracetime more seconds of cpu time, the kernel terminates the process with a SIGKILL signal. | |
| Value | Default: 0 Range: 0-86400 (seconds) The recommended initial value is site dependent. |
The paging daemon, vhand, frees up memory as the need arises. This daemon uses a “least recently used” algorithm to approximate process working sets and writes those pages out to disks that have not been touched during a specified period of time. The page size is 4K for 32 bit kernels and 16K for 64 bit kernels.
The vhand program reclaims memory by:
Stealing memory from processes that have exceeded their permissible resident set size maximum, forcing delayed write data buffers out to disk (with bdflush) so that the underlying pages can be reused
Calling down to system resource allocators to trim back dynamically sized data structures
Stealing pages from processes in order of lowest-priority process first, and the least-recently-used page first within that process
The following tunable parameters determine how often vhand runs and under what conditions. Note that the default values should be adequate for most applications.
The following parameters are included:
bdflushr specifies how many buffers will be written to disk at a time; bdflush performs flushes of dirty filesystem buffers once per second.
gpgsmsk specifies the mask used to determine if a given page may be swapped.
gpgshi specifies the number of free pages above which vhand stops stealing pages.
gpgslo specifies the number of free pages below which vhand starts stealing pages.
maxlkmem specifies the maximum number of physical pages that can be locked in memory (by mpin(2) or plock(2)) by a non-superuser process.
maxfc specifies the maximum number of pages that will be freed at once.
maxsc specifies the maximum number of pages that may be swapped by the vhand daemon in a single operation.
maxdc specifies the maximum number of pages that will be written to disk at once.
minarmem specifies the minimum available resident pages of memory.
minasmem specifies the minimum available swappable pages of memory.
numa_paging_node_freemem_low_threshold specifies when to trigger a global system memory accounting procedure to check if vhandfs should be started.
scache_pool_size specifies the amount of memory always kept in reserve for use by the paging daemon.
tlbdrop specifies number of clock ticks before a process' wired entries are flushed.
vfs_syncr specifies the rate at which vfs_syncr is run, in seconds.
maxpglst specifies the maximum number of pages that can be held in each pageout queue.
zone_accum_limit specifies the percentage of memory (in a node on a NUMA system) that can be accumulated before shaked is kicked off to shake the zone of free memory back into the global pool.
The following parameters determine page sizes as discussed in this section:
| Description | The bdflushr parameter specifies how many buffers will be examined each time bdflush runs; bdflush performs periodic flushes of dirty filesystem buffers. It is parallel and similar to vfs_syncr. The bdflush daemon runs once per second. This parameter is specified in /var/sysgen/mtune. For more information, see the autoup kernel parameter. | |
| Value | Default: 5 Range: 1–31536000 | |
| When to Change | The default value is adequate for most systems. |
| Description | The gpgsmsk parameter specifies the mask used to determine if a given page may be swapped. Whenever the pager (vhand) is run, it decrements software reference bits for every active page. When a process subsequently references a page, the counter is reset to the limit (NDREF, as defined in /usr/include/sys/immu.h). When the pager is looking for pages to steal back (if memory is in short supply), it takes only pages whose reference counter has fallen to gpgsmsk or below. This parameter is specified in /var/sysgen/mtune. Also see /usr/include/sys/immu.h and /usr/include/sys/tuneable.h and the gpgshi and gpgslo kernel parameters for more information. | |
| Value | Default: 2 Range: 0–7 | |
| When to Change | This value is adequate for most systems. | |
| Notes | If the value is greater than 4, pages are written to the swap area earlier than they would be with the default value of gpgsmsk. Thus swapping/paging may occur before it should, unnecessarily using system resources. |
| Description | When the vhand daemon (page handler) is stealing pages, it stops stealing when the amount of free pages is greater than gpgshi. In other words, vhand starts stealing pages when there are fewer than gpgslo free pages in the system. Once vhand starts stealing pages, it continues until there are gpgshi pages. If, at boot time, gpgslo and gpgshi are 0, the system sets gpgshi to 8% of the number of pages of memory in the system, and sets gpgslo to one half of gpgshi. This parameter is specified in /var/sysgen/mtune. For more information, see the kernel parameters gpgsmsk and gpgslo. | |
| Value | Default: 0 (automatically configured to 8% of memory if set to 0) Range: 30 pages – 1/2 of memory | |
| When to Change | This value is adequate for most systems. The recommended initial value for large (64 processors or greater) systems is 2000. | |
| Notes | If this parameter is too small, vhand cannot supply enough free memory for system-wide demand. |
| Description | When the vhand daemon (page handler) executes, it would not start stealing back pages unless there are fewer than gpgslo free pages in the system. Once vhand starts stealing pages, it continues until there are gpgshi pages. This parameter is specified in /var/sysgen/mtune. For more information, see the gpgshi and gpgsmsk kernel parameters. | |
| Value | Default: 0 (automatically configured to half of gpgshi if set to 0) Range: 10 pages – 1/2 of memory | |
| When to Change | This value is adequate for most systems. The recommended initial value for large (64 processors or greater) systems is 1000. | |
| Notes | If this parameter is too small, vhand does not start swapping pages; thus entire processes must be swapped. If this parameter is too large, vhand swaps pages unnecessarily. |
| Description | The maxlkmem parameter specifies the maximum number of physical pages that can be locked in memory (by mpin(2) or plock(2)) per non-superuser process. This parameter is specified in /var/sysgen/mtune. | |
| Value | Default: 2000 Range: 0 pages – 3/4 of physical memory | |
| When to Change | Increase this parameter only if a particular application has a real need to lock more pages in memory. On multi-user servers, you may want to decrease this parameter and also decrease rlimit_vmem_cur. | |
| Notes | When pages are locked in memory, the system cannot reclaim those pages, and therefore cannot maintain the most efficient paging. |
| Description | The maxfc parameter specifies the maximum number of pages that may be freed by the vhand daemon in a single operation. When the paging daemon (vhand) starts stealing pages, it collects pages that can be freed to the general page pool. It collects, at most, maxfc pages at a time before freeing them. Do not confuse this parameter with gpgshi, which sets the total number of pages that must be free before vhand stops stealing pages. This parameter is specified in /var/sysgen/mtune. | |
| Value | Default: 100 Range: 50–100 | |
| When to Change | This value is adequate for most systems. |
| Description | The maxsc parameter specifies the maximum number of pages that may be swapped by the vhand daemon in a single operation. When the paging daemon starts tossing pages, it collects pages that must be written out to swap space before they are actually swapped and then freed into the general page pool. It collects at most maxsc pages at a time before swapping them out. This parameter is specified in /var/sysgen/mtune. | |
| Value | Default: 100 Range: 8–100 | |
| When to Change | You may want to decrease this parameter on systems that are swapping over NFS ( Network File System). This is always the case for diskless systems to increase performance. |
| Description | The maxdc parameter is the maximum number of pages which can be saved up and written to the disk at one time. | |
| Value | Default: 100 pages Range: 1-100 | |
| When to Change | If the system is low on memory and consistently paging out user memory to remote swap space (for example, mounted via NFS), decrease this parameter by not more than ten pages at a time. However, this parameter's setting does not usually make any measurable difference in system performance. |
| Description | The minarmem parameter represents the minimum available resident memory that must be maintained in order to avoid deadlock. | |
| Value | Default: 0 (Autoconfigured if set to 0) | |
| When to Change | The automatically configured value of this parameter should always be correct for each system. You should not have to change this parameter. |
| Description | The minasmem parameter represents the minimum available swappable memory that must be maintained in order to avoid deadlock. | |
| Value | Default: 0 (Autoconfigured if set to 0) | |
| When to Change | The automatically configured value of this parameter should always be correct for each system. You should not have to change this parameter. |
| Description | The scache_pool_size parameter specifies the amount of memory always kept in reserve for use by the paging daemon. The value is the number of kilobytes reserved, which is always rounded up to the next page boundary. | |
| Value | Default: 32 | |
| When to Change | Use caution when changing this parameter. Setting it too low will result in memory deadlocks. Setting it too high will waste memory. If the system panics with the message scache... out of memory, then this parameter should be increased. Otherwise, you should not have to change this parameter. |
| Description | The tlbdrop parameter specifies the number of clock ticks before a process's wired entries are flushed. | |
| Value | Default: 100 | |
| When to Change | If sar indicates a great deal of transaction lookaside buffer (utlbmiss) overhead in a very large application, you may need to increase this parameter. In general, the more the application changes the memory frame of reference in which it is executing, the more likely increasing tlbdrop will help performance. You may have to experiment somewhat to find the optimum value for your specific application. |
| Description | The zone_accum_limit parameter specifies the percentage of memory (in a node on a NUMA system) that can be accumulated before shaked is kicked off to shake the zone of free memory back into the global pool. This parameter is set to 30%, which means if the amount of free memory kept in zones exceeds 30%, shaked is kicked off. | |
| Value | Default: 30 Range: 0 - 100 |
| Description | The percent_totalmem_64k_pages parameter specifies the percentage of total memory that can be used as an upper limit for the number of 64 KB pages. | |
| Value | Default: 0 Range: 0-100 (%) | |
| When to Change | Set dynamically to get 64 KB pages. The recommended initial value for large (64 processors or greater) systems is 0. |
| Description | The nlpages_64k parameter is used to reserve 64 KB pages at boot time. This increases the probability of getting large pages in a low memory system. | |
| Value | Default: 0 Range: 0-memory_size/64*1024, where memory_size is the total amount of memory in the system. | |
| When to Change | Not recommended unless absolutely necessary. |
The IPC tunable parameters set interprocess communication (IPC) structures. These structures include IPC messages, specified in /var/sysgen/mtune/msg; IPC semaphores, specified in /var/sysgen/mtune/sem; and IPC shared memory, specified in /var/sysgen/mtune/kernel.
If IPC (interprocess communication) structures are incorrectly set, certain system calls will fail and return errors.
Before increasing the size of an IPC parameter, investigate the problem by using ipcs(1) to see if the IPC resources are being removed when no longer needed. For example, shmget returns the error ENOSPC if applications do not remove semaphores, memory segments, or message queues.
Note that IPC objects differ from most IRIX objects in that they are not automatically freed when all active references to them are gone. In particular, they are not deallocated when the program that created them exits.
Table A-1 lists error messages, system calls that cause the error, and parameters to adjust. Subsequent paragraphs explain the details you need to know before you increase the parameters listed in this table.
Table A-1. System Call Errors and IPC Parameters to Adjust
Message | System Call | Parameter |
|---|---|---|
EAGAIN | msgsnd() | see below |
EINVAL | msgsnd() | msgmax |
EMFILE | shmat() | sshmseg |
ENOSPC | semget() | msgmni |
| EAGAIN | If IPC_NOWAIT is set, msgsnd can return EAGAIN for a number of reasons:
| |
| EINVAL | shmget (which gets a new shared memory segment identifier) will fail with EINVAL if the given size is not within shmmin and shmmax. Since shmmin is set to the lowest possible value (1), and shmmax is very large, it should not be necessary to change these values. | |
| EMFILE | shmat will return EMFILE if it attaches more than sshmseg shared memory segments. sshmseg is the total number of system-shared memory segments per process. | |
| ENOSPC | shmget will return ENOSPC if shmmni (the system-wide number of shared memory segments) is too small. However, applications may be creating shared memory segments and forgetting to remove them. So, before making a parameter change, use ipcs(1) to get a listing of currently active shared memory segments. semget returns ENOSPC if semmni is too small, indicating that the total number of semaphore identifiers is exceeded. msgget will return ENOSPC if msgmni is too small. Use ipcs to see if message queues are being removed as they should be. |
If no one on the system uses or plans to use IPC messages, you may want to consider excluding this module. The following tunable parameters are associated with interprocess communication messages (see the msgctl(2) man page):
msgmax specifies the maximum size of a message.
msgmnb specifies the maximum length of a message queue.
msgmni specifies the maximum number of message queues system-wide.
msgseg specifies the maximum number of message segments system-wide.
msgssz specifies the size, in bytes, of a message segment.
msgtql specifies the maximum number of message headers system-wide.
| Description | The msgmax parameter specifies the maximum size of a message. This parameter is specified in /var/sysgen/mtune/msg. | |
| Value | Default: 16 * 1024 (0x4000) Range: 512-0x8000 | |
| When to Change | Increase this parameter if the maximum size of a message needs to be larger. Decrease the value to limit the size of messages. |
| Description | The msgmnb parameter specifies the maximum length of a message queue. This parameter is specified in /var/sysgen/mtune/msg. | |
| Value | Default: 32 * 1024 (0x8000) Range: msgmax–1/2 of physical memory | |
| When to Change | Increase this parameter if the maximum number of bytes on a message queue needs to be longer. Decrease the value to limit the number of bytes per message queue. |
| Description | The msgmni parameter specifies the maximum number of message queues system-wide. This parameter is specified in /var/sysgen/mtune/msg. | ||
| Value | Default: 50 Range: 10–1000 | ||
| When to Change | Increase this parameter if you want more message queues on the system. Decrease the value to limit the message queues. | ||
| Notes | If there are not enough message queues, a msgget(2) system call that attempts to create a new message queue returns the error:
|
| Description | The msgseg parameter specifies the maximum number of message segments system-wide. A message on a message queue consists of one or more of these segments. The size of each segment is set by the msgssz parameter. This parameter is specified in /var/sysgen/mtune/msg. | |
| Value | Default: 1536 | |
| When to Change | Modify this parameter to reserve the appropriate amount of memory for messages. Increase this parameter if you need more memory for message segments on the system. Decrease the value to limit the amount of memory used for message segments. | |
| Notes | If this parameter is too large, memory may be wasted (saved for messages but never used). If this parameter is too small, some messages that are sent will not fit into the reserved message buffer space. In this case, a msgsnd(2) system call waits until space becomes available. |
| Description | The msgssz parameter specifies the size, in bytes, of a message segment. Messages consist of a contiguous set of message segments large enough to accommodate the text of the message. Using segments helps to eliminate fragmentation and speed the allocation of the message buffers. This parameter is specified in /var/sysgen/mtune/msg. | |
| Value | Default: 8 | |
| When to Change | This parameter is set to minimize wasted message buffer space. Change this parameter only if most messages do not fit into one segment with a minimum of wasted space. If you modify this parameter, you may also need to change the msgseg parameter. | |
| Notes | If this parameter is too large, message buffer space may be wasted by fragmentation, which in turn may cause processes that are sending messages to sleep while waiting for message buffer space. |
| Description | The msgtql parameter specifies the maximum number of message headers system-wide, and thus the number of outstanding (unread) messages. One header is required for each outstanding message. This parameter is specified in /var/sysgen/mtune/msg. | |
| Value | Default: 40 Range: 10–4000 | |
| When to Change | Increase this parameter if you require more outstanding messages. Decrease the value to limit the number of outstanding messages. | |
| Notes | If this parameter is too small, a msgsnd(2) system call attempting to send a message that would put msgtql over the limit waits until messages are received (read) from the queues. |
If no one on the system uses or plans to use IPC semaphores, you may want to consider excluding this module.
The following tunable parameters are associated with interprocess communication semaphores (see the semctl(2) man page):
semmni specifies the maximum number of semaphore identifiers in the kernel.
semmsl specifies the maximum number of semaphores per semaphore identifier.
semopm specifies the maximum number of semaphore operations that can be executed per semop(2) system call.
semvmx specifies the maximum value that a semaphore can have.
semaem specifies the adjustment on exit for maximum value.
| Description | The semmni parameter specifies the maximum number of semaphore identifiers in the kernel. This is the number of unique semaphore sets that can be active at any given time. Semaphores are created in sets; there may be more than one semaphore per set. This parameter is specified in /var/sysgen/mtune/sem. | |
| Value | Default: 300 | |
| When to Change | Increase this parameter if processes require more semaphore sets. Increasing this parameter to a large value requires more memory to keep track of semaphore sets. If you modify this parameter, you may need to modify other related parameters. The recommended initial value for large (64 processors or greater) systems is 2000. |
| Description | The semmsl parameter specifies the maximum number of semaphores per semaphore identifier. This parameter is specified in /var/sysgen/mtune/sem. | |
| Value | Default: 100 | |
| When to Change | Increase this parameter if processes require more semaphores per semaphore identifier. |
| Description | The semopm parameter specifies the maximum number of semaphore operations that can be executed per semop() system call. This parameter permits the system to check or modify the value of more than one semaphore in a set with each semop() system call. This parameter is specified in /var/sysgen/mtune/sem. | |
| Value | Default: 100 | |
| When to Change | Change this parameter to increase/decrease the number of operations permitted per semop() system call. You may need to increase this parameter if you increase semmsl (the number of semaphore sets), so that a process can check/modify all the semaphores in a set with one system call. |
| Description | The semvmx parameter specifies the maximum value that a semaphore can have. This parameter is specified in /var/sysgen/mtune/sem. | |
| Value | Default: 32767 (maximum value) | |
| When to Change | Decrease this parameter if you want to limit the maximum value for a semaphore. |
| Description | The semaem parameter specifies the adjustment on exit for maximum value, alias semadj. This value is used when a semaphore value becomes greater than or equal to the absolute value of semop(2), unless the program has set its own value. This parameter is specified in /var/sysgen/mtune/sem. | |
| Value | Default: 16384 (maximum value) | |
| When to Change | Change this parameter to decrease the maximum value for the adjustment on exit value. |
The following tunable parameters are associated with interprocess communication shared memory:
shmmax specifies the maximum size in bytes of an individual shared memory segment.
shmmin specifies the minimum size in bytes of an shared memory segment.
shmmni specifies the maximum number of shared memory identifiers system-wide.
sshmseg specifies the maximum number of attached shared memory segments per process.
| Description | The shmmax parameter specifies the maximum size in bytes of an individual shared memory segment. This parameter is specified in /var/sysgen/mtune/kernel. | |
| Value | Default: 0 32-bit Range: 0x1000 - 0x7fffffff 64-bit Range: 0x1000 - 0x7fffffffffffffff ll | |
| When to Change | If the value of shmmax is 0, it will be adjusted to be 80% of the system memory size at boot time. If the default value specifies a number, kernel will obey that. Keep this parameter small if it is necessary that a single shared memory segment not use too much memory. The recommended initial value for large (64 processors or greater) systems is (0x4000000) 11. |
| Description | The shmmin parameter specifies the minimum size in bytes of a shared memory segment. This parameter is specified in /var/sysgen/mtune/kernel. | |
| Value | Default: 1 byte Range: 1 | |
| When to Change | Increase this parameter if you want an error message to be generated when a process requests a shared memory segment that is too small. |
| Description | The shmmni parameter specifies the maximum number of shared memory segments system-wide. This parameter is specified in /var/sysgen/mtune/kernel. | |
| Value | Default: 0 Range: 5–100000 | |
| When to Change | If shmmni default value is 0, it will be adjusted at boot time to be the same value as the nproc tunable variable. If the default value specifies a number, kernel will obey that. Increase this parameter by one (1) for each additional shared memory segment that is required, and also if processes that use many shared memory segments reach the shmmni limit. Decrease this parameter if you need to reduce the maximum number of shared memory segments of the system at any one time. Also decrease it to reduce the amount of kernel space taken for shared memory segments. |
| Description | The sshmseg parameter specifies the maximum number of attached shared memory segments per process. A process must attach a shared memory segment before the data can be accessed. This parameter is specified in /var/sysgen/mtune/kernel. | |
| Value | Default: 2000 Range: 1–10000 | |
| When to Change | Increase this parameter if processes need to attach more than the default number of shared memory segments at one time. |
The following parameters are associated with streams processing:
nstrpush specifies the maximum number of modules that can be pushed on a stream.
nstrintr specifies the maximum number.
strctlsz specifies the maximum size of the ctl part of message.
strmsgsz specifies the maximum stream message size.
strholdtime specifies the maximum stream hold time.
strpmonmax specifies the maximum private monitors.
| Description | The nstrpush parameter defines the maximum number of streams modules that can be pushed on a single stream. | |
| Value | Default: 9 (0x9) Range: 9-10 | |
| When to Change | Change nstrpush from 9 to 10 modules when you need an extra module. |
| Description | The nstrintr parameter defines the streams buffers used at interrupt time. | |
| Value | Default: 1024 (0x400) Range: 32-4096 |