Adjust |ulimit -n| automatically, no bash required (#5586)
This commit is contained in:
		@@ -431,6 +431,45 @@ fn get_bank_forks(
 | 
			
		||||
    (bank_forks, bank_forks_info, leader_schedule_cache)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[cfg(not(unix))]
 | 
			
		||||
fn adjust_ulimit_nofile() {}
 | 
			
		||||
 | 
			
		||||
#[cfg(unix)]
 | 
			
		||||
fn adjust_ulimit_nofile() {
 | 
			
		||||
    // Rocks DB likes to have many open files.  The default open file descriptor limit is
 | 
			
		||||
    // usually not enough
 | 
			
		||||
    let desired_nofile = 65000;
 | 
			
		||||
 | 
			
		||||
    fn get_nofile() -> libc::rlimit {
 | 
			
		||||
        let mut nofile = libc::rlimit {
 | 
			
		||||
            rlim_cur: 0,
 | 
			
		||||
            rlim_max: 0,
 | 
			
		||||
        };
 | 
			
		||||
        if unsafe { libc::getrlimit(libc::RLIMIT_NOFILE, &mut nofile) } != 0 {
 | 
			
		||||
            warn!("getrlimit(RLIMIT_NOFILE) failed");
 | 
			
		||||
        }
 | 
			
		||||
        nofile
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    let mut nofile = get_nofile();
 | 
			
		||||
    if nofile.rlim_cur < desired_nofile {
 | 
			
		||||
        nofile.rlim_cur = desired_nofile;
 | 
			
		||||
        if unsafe { libc::setrlimit(libc::RLIMIT_NOFILE, &nofile) } != 0 {
 | 
			
		||||
            error!(
 | 
			
		||||
                "Unable to increase the maximum open file descriptor limit to {}",
 | 
			
		||||
                desired_nofile
 | 
			
		||||
            );
 | 
			
		||||
 | 
			
		||||
            if cfg!(target_os = "macos") {
 | 
			
		||||
                error!("On mac OS you may need to run |sudo launchctl limit maxfiles 65536 200000| first");
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        nofile = get_nofile();
 | 
			
		||||
    }
 | 
			
		||||
    info!("Maximum open file descriptors: {}", nofile.rlim_cur);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
pub fn new_banks_from_blocktree(
 | 
			
		||||
    blocktree_path: &Path,
 | 
			
		||||
    account_paths: Option<String>,
 | 
			
		||||
@@ -448,6 +487,8 @@ pub fn new_banks_from_blocktree(
 | 
			
		||||
) {
 | 
			
		||||
    let genesis_block = GenesisBlock::load(blocktree_path).expect("Failed to load genesis block");
 | 
			
		||||
 | 
			
		||||
    adjust_ulimit_nofile();
 | 
			
		||||
 | 
			
		||||
    let (blocktree, ledger_signal_receiver, completed_slots_receiver) =
 | 
			
		||||
        Blocktree::open_with_signal(blocktree_path).expect("Failed to open ledger database");
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -3,9 +3,6 @@
 | 
			
		||||
# Adjusts system settings for optimal fullnode performance
 | 
			
		||||
#
 | 
			
		||||
 | 
			
		||||
# shellcheck source=scripts/ulimit-n.sh
 | 
			
		||||
source "$(dirname "${BASH_SOURCE[0]}")"/ulimit-n.sh
 | 
			
		||||
 | 
			
		||||
sysctl_write() {
 | 
			
		||||
  declare name=$1
 | 
			
		||||
  declare new_value=$2
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user