mirror of
https://github.com/scylladb/scylladb.git
synced 2026-04-29 20:57:00 +00:00
Currently --ami does not check instance types, creates invalid io_properties.yaml on unsupported instance types. It actually won't occur on AMI startup, since scylla_ami_setup only invoke scylla_io_setup --ami when the instance is supported, so we don't get the issue on startup, but we still get when we run scylla_io_setup manually. It's better to check instance type on scylla_io_setup, too. Refs #5438
144 lines
7.1 KiB
Python
Executable File
144 lines
7.1 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
# -*- coding: utf-8 -*-
|
|
#
|
|
# Copyright (C) 2017 ScyllaDB
|
|
#
|
|
|
|
#
|
|
# This file is part of Scylla.
|
|
#
|
|
# Scylla is free software: you can redistribute it and/or modify
|
|
# it under the terms of the GNU Affero General Public License as published by
|
|
# the Free Software Foundation, either version 3 of the License, or
|
|
# (at your option) any later version.
|
|
#
|
|
# Scylla is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with Scylla. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
import os
|
|
import re
|
|
from scylla_util import *
|
|
import subprocess
|
|
import argparse
|
|
import yaml
|
|
import logging
|
|
import sys
|
|
import scylla_blocktune as blocktune
|
|
|
|
if __name__ == "__main__":
|
|
parser = argparse.ArgumentParser(description='IO Setup script for Scylla.')
|
|
parser.add_argument('--ami', dest='ami', action='store_true',
|
|
help='configure AWS AMI')
|
|
args = parser.parse_args()
|
|
|
|
cpudata = scylla_cpuinfo()
|
|
if not is_developer_mode():
|
|
if args.ami:
|
|
idata = aws_instance()
|
|
|
|
if not idata.is_supported_instance_class():
|
|
logging.error('{} is not supported instance type, run "scylla_io_setup" again without --ami option.'.format(idata.instance()))
|
|
sys.exit(1)
|
|
disk_properties = {}
|
|
disk_properties["mountpoint"] = datadir()
|
|
nr_disks = len(idata.ephemeral_disks())
|
|
## both i3 and i2 can run with 1 I/O Queue per shard
|
|
if idata.instance() == "i3.large":
|
|
disk_properties["read_iops"] = 111000
|
|
disk_properties["read_bandwidth"] = 653925080
|
|
disk_properties["write_iops"] = 36800
|
|
disk_properties["write_bandwidth"] = 215066473
|
|
elif idata.instance() == "i3.xlarge":
|
|
disk_properties["read_iops"] = 200800
|
|
disk_properties["read_bandwidth"] = 1185106376
|
|
disk_properties["write_iops"] = 53180
|
|
disk_properties["write_bandwidth"] = 423621267
|
|
elif idata.instance_class() == "i3":
|
|
disk_properties["read_iops"] = 411200 * nr_disks
|
|
disk_properties["read_bandwidth"] = 2015342735 * nr_disks
|
|
disk_properties["write_iops"] = 181500 * nr_disks
|
|
disk_properties["write_bandwidth"] = 808775652 * nr_disks
|
|
elif idata.instance_class() == "i3en":
|
|
if idata.instance() == "i3en.large":
|
|
disk_properties["read_iops"] = 43315
|
|
disk_properties["read_bandwidth"] = 330301440
|
|
disk_properties["write_iops"] = 33177
|
|
disk_properties["write_bandwidth"] = 165675008
|
|
elif idata.instance() in ("i3.xlarge", "i3en.2xlarge"):
|
|
disk_properties["read_iops"] = 84480 * nr_disks
|
|
disk_properties["read_bandwidth"] = 666894336 * nr_disks
|
|
disk_properties["write_iops"] = 66969 * nr_disks
|
|
disk_properties["write_bandwidth"] = 333447168 * nr_disks
|
|
else:
|
|
disk_properties["read_iops"] = 257024 * nr_disks
|
|
disk_properties["read_bandwidth"] = 2043674624 * nr_disks
|
|
disk_properties["write_iops"] = 174080 * nr_disks
|
|
disk_properties["write_bandwidth"] = 1024458752 * nr_disks
|
|
elif idata.instance_class() == "i2":
|
|
disk_properties["read_iops"] = 64000 * nr_disks
|
|
disk_properties["read_bandwidth"] = 507338935 * nr_disks
|
|
disk_properties["write_iops"] = 57100 * nr_disks
|
|
disk_properties["write_bandwidth"] = 483141731 * nr_disks
|
|
properties_file = open(etcdir() + "/scylla.d/io_properties.yaml", "w")
|
|
yaml.dump({ "disks": [ disk_properties ] }, properties_file, default_flow_style=False)
|
|
ioconf = open(etcdir() + "/scylla.d/io.conf", "w")
|
|
ioconf.write("SEASTAR_IO=\"--io-properties-file={}\"\n".format(properties_file.name))
|
|
else:
|
|
if "SCYLLA_CONF" in os.environ:
|
|
conf_dir = os.environ["SCYLLA_CONF"]
|
|
else:
|
|
conf_dir = etcdir() + "/scylla"
|
|
cfg = yaml.safe_load(open(os.path.join(conf_dir, "scylla.yaml")))
|
|
default_path = cfg.get('workdir') or datadir()
|
|
if not "data_file_directories" in cfg:
|
|
cfg["data_file_directories"] = [os.path.join(default_path, 'data')]
|
|
data_dirs = cfg["data_file_directories"]
|
|
|
|
for t in [ "commitlog", "hints", "view_hints", "saved_caches" ]:
|
|
key = "%s_directory" % t
|
|
if key in cfg:
|
|
data_dirs += [ cfg[key] ]
|
|
elif os.path.isdir(os.path.join(default_path, t)):
|
|
data_dirs += [ os.path.join(default_path, t) ]
|
|
|
|
iotune_args = []
|
|
for data_dir in data_dirs:
|
|
if os.path.exists(data_dir) == False:
|
|
logging.error("%s was not found. Please check the configuration and run scylla_io_setup again.\n", data_dir)
|
|
sys.exit(1)
|
|
if os.path.isdir(data_dir) == False:
|
|
logging.error("%s is not a directory. Please check the configuration and run scylla_io_setup again.\n", data_dir)
|
|
sys.exit(1)
|
|
st = os.statvfs(data_dir)
|
|
avail = st.f_bavail * st.f_frsize
|
|
rec = 10000000000
|
|
if avail < rec:
|
|
logging.error("Filesystem at %s has only %d bytes available; that is less than the recommended 10 GB. Please free up space and run scylla_io_setup again.\n", data_dir, avail)
|
|
sys.exit(1)
|
|
blocktune.tune_fs(data_dir, '2')
|
|
iotune_args += [ "--evaluation-directory", data_dir ]
|
|
|
|
if cpudata.cpuset():
|
|
iotune_args += [ "--cpuset", ",".join(map(str, cpudata.cpuset())) ]
|
|
elif cpudata.smp():
|
|
iotune_args += [ "--smp", str(cpudata.smp()) ]
|
|
|
|
try:
|
|
subprocess.check_call([bindir() + "/iotune",
|
|
"--format", "envfile",
|
|
"--options-file", etcdir() + "/scylla.d/io.conf",
|
|
"--properties-file", etcdir() + "/scylla.d/io_properties.yaml"] + iotune_args)
|
|
except Exception:
|
|
logging.error("%s did not pass validation tests, it may not be on XFS and/or has limited disk space.\n"
|
|
"This is a non-supported setup, and performance is expected to be very bad.\n"
|
|
"For better performance, placing your data on XFS-formatted directories is required.\n"
|
|
"To override this error, enable developer mode as follow:\n"
|
|
"sudo %s/scylla_dev_mode_setup --developer-mode 1", data_dirs, scriptsdir())
|
|
sys.exit(1)
|
|
|