def setup_swapfile(fname, size=None, maxsize=None): """ fname: full path string of filename to setup size: the size to create. set to "auto" for recommended maxsize: the maximum size """ swap_dir = os.path.dirname(fname) if str(size).lower() == "auto": try: memsize = util.read_meminfo()["total"] except IOError: LOG.debug("Not creating swap: failed to read meminfo") return util.ensure_dir(swap_dir) size = suggested_swapsize(fsys=swap_dir, maxsize=maxsize, memsize=memsize) mibsize = str(int(size / (2**20))) if not size: LOG.debug("Not creating swap: suggested size was 0") return util.log_time( LOG.debug, msg="Setting up swap file", func=create_swapfile, args=[fname, mibsize], ) return fname
def setup_swapfile(fname, size=None, maxsize=None): """ fname: full path string of filename to setup size: the size to create. set to "auto" for recommended maxsize: the maximum size """ tdir = os.path.dirname(fname) if str(size).lower() == "auto": try: memsize = util.read_meminfo()['total'] except IOError: LOG.debug("Not creating swap: failed to read meminfo") return util.ensure_dir(tdir) size = suggested_swapsize(fsys=tdir, maxsize=maxsize, memsize=memsize) if not size: LOG.debug("Not creating swap: suggested size was 0") return mbsize = str(int(size / (2**20))) msg = "creating swap file '%s' of %sMB" % (fname, mbsize) try: util.ensure_dir(tdir) # Check if filesystem is safe for fallocate fname_fs_type = util.get_mount_info(fname)[1] if fname_fs_type in ['xfs']: create_swapfile_command = 'dd if=/dev/zero "of=$1" bs=1M "count=$2"' else: create_swapfile_command = 'fallocate -l "${2}M" "$1"' util.log_time(LOG.debug, msg, func=util.subp, args=[[ 'sh', '-c', ('rm -f "$1" && umask 0066 && ' '%s && ' 'mkswap "$1" || { r=$?; rm -f "$1"; exit $r; }' % create_swapfile_command), 'setup_swap', fname, mbsize ]]) except Exception as e: raise IOError("Failed %s: %s" % (msg, e)) return fname
def setup_swapfile(fname, size=None, maxsize=None): """ fname: full path string of filename to setup size: the size to create. set to "auto" for recommended maxsize: the maximum size """ tdir = os.path.dirname(fname) if str(size).lower() == "auto": try: memsize = util.read_meminfo()['total'] except IOError as e: LOG.debug("Not creating swap. failed to read meminfo") return util.ensure_dir(tdir) size = suggested_swapsize(fsys=tdir, maxsize=maxsize, memsize=memsize) if not size: LOG.debug("Not creating swap: suggested size was 0") return mbsize = str(int(size / (2 ** 20))) msg = "creating swap file '%s' of %sMB" % (fname, mbsize) try: util.ensure_dir(tdir) util.log_time(LOG.debug, msg, func=util.subp, args=[['sh', '-c', ('rm -f "$1" && umask 0066 && ' '{ fallocate -l "${2}M" "$1" || ' ' dd if=/dev/zero "of=$1" bs=1M "count=$2"; } && ' 'mkswap "$1" || { r=$?; rm -f "$1"; exit $r; }'), 'setup_swap', fname, mbsize]]) except Exception as e: raise IOError("Failed %s: %s" % (msg, e)) return fname
def suggested_swapsize(memsize=None, maxsize=None, fsys=None): # make a suggestion on the size of swap for this system. if memsize is None: memsize = util.read_meminfo()['total'] GB = 2**30 sugg_max = 8 * GB info = {'avail': 'na', 'max_in': maxsize, 'mem': memsize} if fsys is None and maxsize is None: # set max to 8GB default if no filesystem given maxsize = sugg_max elif fsys: statvfs = os.statvfs(fsys) avail = statvfs.f_frsize * statvfs.f_bfree info['avail'] = avail if maxsize is None: # set to 25% of filesystem space maxsize = min(int(avail / 4), sugg_max) elif maxsize > ((avail * .9)): # set to 90% of available disk space maxsize = int(avail * .9) elif maxsize is None: maxsize = sugg_max info['max'] = maxsize formulas = [ # < 1G: swap = double memory (1 * GB, lambda x: x * 2), # < 2G: swap = 2G (2 * GB, lambda x: 2 * GB), # < 4G: swap = memory (4 * GB, lambda x: x), # < 16G: 4G (16 * GB, lambda x: 4 * GB), # < 64G: 1/2 M up to max (64 * GB, lambda x: x / 2), ] size = None for top, func in formulas: if memsize <= top: size = min(func(memsize), maxsize) # if less than 1/2 memory and not much, return 0 if size < (memsize / 2) and size < 4 * GB: size = 0 break break if size is not None: size = maxsize info['size'] = size MB = 2**20 pinfo = {} for k, v in info.items(): if isinstance(v, int): pinfo[k] = "%s MB" % (v / MB) else: pinfo[k] = v LOG.debug( "suggest %s swap for %s memory with '%s'" " disk given max=%s [max=%s]'", pinfo['size'], pinfo['mem'], pinfo['avail'], pinfo['max_in'], pinfo['max']) return size
def suggested_swapsize(memsize=None, maxsize=None, fsys=None): # make a suggestion on the size of swap for this system. if memsize is None: memsize = util.read_meminfo()['total'] GB = 2 ** 30 sugg_max = 8 * GB info = {'avail': 'na', 'max_in': maxsize, 'mem': memsize} if fsys is None and maxsize is None: # set max to 8GB default if no filesystem given maxsize = sugg_max elif fsys: statvfs = os.statvfs(fsys) avail = statvfs.f_frsize * statvfs.f_bfree info['avail'] = avail if maxsize is None: # set to 25% of filesystem space maxsize = min(int(avail / 4), sugg_max) elif maxsize > ((avail * .9)): # set to 90% of available disk space maxsize = int(avail * .9) elif maxsize is None: maxsize = sugg_max info['max'] = maxsize formulas = [ # < 1G: swap = double memory (1 * GB, lambda x: x * 2), # < 2G: swap = 2G (2 * GB, lambda x: 2 * GB), # < 4G: swap = memory (4 * GB, lambda x: x), # < 16G: 4G (16 * GB, lambda x: 4 * GB), # < 64G: 1/2 M up to max (64 * GB, lambda x: x / 2), ] size = None for top, func in formulas: if memsize <= top: size = min(func(memsize), maxsize) # if less than 1/2 memory and not much, return 0 if size < (memsize / 2) and size < 4 * GB: size = 0 break break if size is not None: size = maxsize info['size'] = size MB = 2 ** 20 pinfo = {} for k, v in info.items(): if isinstance(v, int): pinfo[k] = "%s MB" % (v / MB) else: pinfo[k] = v LOG.debug("suggest %(size)s swap for %(mem)s memory with '%(avail)s'" " disk given max=%(max_in)s [max=%(max)s]'" % pinfo) return size