背景
CentOS7 下的 Service 命令都被重定向到 systemctl 了,PerconaMySQL 安装完成后,会自动添加开机启动服务,它的服务脚本文件为 my,如果需要对该服务脚本进行改造,添加 numa 控制,该怎么办呢?本文来探讨这个问题。
问题
搜索 MySQL 开机启动服务文件,得到结果如下:
find / -name my
/etc/systemd/system/my
我希望修改该文件,于是进入目录,准备下载到本机,但是每次都下载失败,仔细观察发现它的文件名称前面有一个回形针图标,说明它是一个软链接。
分析
事实上,my 它真正的文件路径为 /usr/lib/systemd/system。
内容如下:
[Unit] Description=MySQL Server Documentation=man:mysqld(8) Documentation= After=ne After= [Install] WantedBy=mul Alias=my [Service] User=mysql Group=mysql Type=forking PIDFile=/var/run/mysqld # Disable service start and stop timeout logic of systemd for mysqld service. TimeoutSec=0 # Execute pre and post scripts as root PermissionsStartOnly=true # Needed to create system tables ExecStartPre=/usr/bin/mysqld_pre_systemd # Start main service ExecStart=/usr/bin/numactl --cpubind=0 --membind=0 /usr/sbin/mysqld --daemonize --pid-file= /var/run/mysqld $MYSQLD_OPTS # Use this to switch malloc implementation EnvironmentFile=-/etc/sysconfig/mysql # Sets open_files_limit LimitNOFILE = 5000 Restart=on-failure RestartPreventExitStatus=1 PrivateTmp=false
这是 systemd 统一的 service 配置,install 标签的 Alias=my 说明了我们常用的 service mysql 就是这个服务,它真正的服务名称是mysqld,这就可以解释为什么有些MySQL的服务名称为 mysqld 了。
第一步, 编辑 /etc/systemd/system/my,修改 ExecStart 配置,添加内核绑定逻辑:
ExecStart=/usr/bin/numactl --cpubind=0 --membind=0 /usr/sbin/mysqld
–daemonize --pid-file=/var/run/mysqld $MYSQLD_OPTS
由于这里是配置,而不是直接执行的命令,所以命令名称都需要全路经,不能直接用 numactl 命令,否则会报错导致启动失败。
这个链接文件修改之后,它真正的文件my也自动修改了。
其次, 修改开机启动服务文件后,需要执行reload命令,才能生效。
systemctl daemon-reload
service mysql restart
启示录
顺便看了一下 systemd 的知识,它的目录为 /usr/lib/systemd/system,其下有大量以 service 为后缀的文件,就是所有的开机启动服务文件。内容都有相同的模版,大概就明白了mysql 的开机启动服务是怎么回事儿了。