Debian 7.7上的MySQL 5.6.21 – nice在启动几秒后自动设置为19; 不知道为什么

我使用Debian 7.7在OpenVZ VPS上运行MySQL 5.6.21。 MySQL从DotDeb存储库安装(完整版本号是5.6.21-1〜dotdeb.1)。

每当MySQL服务器启动或重新启动,首先它的好处是0.然而,大约20秒后,它会被自动调整到19(最低优先级),我不明白为什么。

我search了所有的configuration文件,我确认没有cron作业被设置为执行此操作,我查看了启动脚本(/etc/init.d/mysql)。 没有什么会导致这一点。

如果我手动将它重新设为0,有时它会停留在0,有时最终会再次被重新命名为19。

这不会导致这个VPS上托pipe的网站的任何性能问题(我有一些非常有效的caching,这限制了甚至需要接触数据库),但是这个小小的神秘感开始让我感到紧张。 我是一名专业的MySQL DBA,拥有Oracle的MySQL 5.6数据库pipe理员authentication,但我无法弄清楚这个怪癖,这对我来说是非常令人沮丧的。

当然,我可以设置一个小时的cron作业来检查MySQL服务器进程的好坏,如果它发生了变化,请将它重新设为0,但是我想知道为什么会发生这种情况,而不是仅仅用一次皮带它。

任何想法或援助将不胜感激。 谢谢!

/etc/mysql/my.cnf

[client] socket = /var/run/mysqld/mysqld.sock [mysqld_safe] nice = 0 socket = /var/run/mysqld/mysqld.sock log_error = /var/log/mysql/mysql-error.log [mysqld] basedir = /usr bind_address = 127.0.0.1 connect_timeout = 30 datadir = /var/lib/mysql innodb_buffer_pool_size = 224M innodb_file_per_table = 1 innodb_flush_log_at_trx_commit = 2 innodb_log_buffer_size = 4M innodb_log_file_size = 8M innodb_open_files = 2048 innodb_thread_concurrency = 8 interactive_timeout = 60 join_buffer_size = 2M key_buffer_size = 128K log-queries-not-using-indexes = 1 long_query_time = 2 max_allowed_packet = 16M max_connections = 125 max_connect_errors = 100 max_heap_table_size = 1M pid_file = /var/run/mysqld/mysqld.pid query_cache_limit = 8M query_cache_min_res_unit = 1K query_cache_size = 48M query_cache_type = 1 read_rnd_buffer_size = 1M skip_external_locking = 1 slow_query_log = 1 slow_query_log_file = /var/log/mysql/mysql-slow.log socket = /var/run/mysqld/mysqld.sock sort_buffer_size = 1M table_definition_cache = 2048 table_open_cache = 2048 table_open_cache_instances = 4 thread_cache_size = 16 tmp_table_size = 1M user = mysql wait_timeout = 60 [mysqldump] max_allowed_packet = 16M quick quote_names [isamchk] key_buffer = 128K !includedir /etc/mysql/conf.d/ 

/etc/mysql/conf.d中configuration文件的内容

 # # The MySQL 5.6 database server configuration file. # # This custom MySQL 5.6 specific configuration file # adds on top of the existing default my.cnf file at # - /etc/mysql/my.cnf. # # Please add any extra MySQL 5.6 options in this file # for sake of clarity. # # You may uncomment any existing option to enable it # # sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES [mysqld_safe] syslog 

/etc/init.d/mysql

 #!/bin/bash # ### BEGIN INIT INFO # Provides: mysql # Required-Start: $remote_fs $syslog # Required-Stop: $remote_fs $syslog # Should-Start: $network $time # Should-Stop: $network $time # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: Start and stop the mysql database server daemon # Description: Controls the main MySQL database server daemon "mysqld" # and its wrapper script "mysqld_safe". ### END INIT INFO # set -e set -u ${DEBIAN_SCRIPT_DEBUG:+ set -v -x} test -x /usr/bin/mysqld_safe || exit 0 . /lib/lsb/init-functions SELF=$(cd $(dirname $0); pwd -P)/$(basename $0) CONF=/etc/mysql/my.cnf MYADMIN="/usr/bin/mysqladmin --defaults-file=/etc/mysql/debian.cnf" # priority can be overriden and "-s" adds output to stderr ERR_LOGGER="logger -p daemon.err -t /etc/init.d/mysql -i" # Safeguard (relative paths, core dumps..) cd / umask 077 # mysqladmin likes to read /root/.my.cnf. This is usually not what I want # as many admins eg only store a password without a username there and # so break my scripts. export HOME=/etc/mysql/ ## Fetch a particular option from mysql's invocation. # # Usage: void mysqld_get_param option mysqld_get_param() { /usr/sbin/mysqld --print-defaults \ | tr " " "\n" \ | grep -- "--$1" \ | tail -n 1 \ | cut -d= -f2 } ## Do some sanity checks before even trying to start mysqld. sanity_checks() { # check for config file if [ ! -r /etc/mysql/my.cnf ]; then log_warning_msg "$0: WARNING: /etc/mysql/my.cnf cannot be read. See README.Debian.gz" echo "WARNING: /etc/mysql/my.cnf cannot be read. See README.Debian.gz" | $ERR_LOGGER fi # check for diskspace shortage datadir=`mysqld_get_param datadir` if LC_ALL=C BLOCKSIZE= df --portability $datadir/. | tail -n 1 | awk '{ exit ($4>4096) }'; then log_failure_msg "$0: ERROR: The partition with $datadir is too full!" echo "ERROR: The partition with $datadir is too full!" | $ERR_LOGGER exit 1 fi } ## Checks if there is a server running and if so if it is accessible. # # check_alive insists on a pingable server # check_dead also fails if there is a lost mysqld in the process list # # Usage: boolean mysqld_status [check_alive|check_dead] [warn|nowarn] mysqld_status () { ping_output=`$MYADMIN ping 2>&1`; ping_alive=$(( ! $? )) ps_alive=0 pidfile=`mysqld_get_param pid-file` if [ -f "$pidfile" ] && ps `cat $pidfile` >/dev/null 2>&1; then ps_alive=1; fi if [ "$1" = "check_alive" -a $ping_alive = 1 ] || [ "$1" = "check_dead" -a $ping_alive = 0 -a $ps_alive = 0 ]; then return 0 # EXIT_SUCCESS else if [ "$2" = "warn" ]; then echo -e "$ps_alive processes alive and '$MYADMIN ping' resulted in\n$ping_output\n" | $ERR_LOGGER -p daemon.debug fi return 1 # EXIT_FAILURE fi } # # main() # case "${1:-''}" in 'start') sanity_checks; # Start daemon log_daemon_msg "Starting MySQL database server" "mysqld" if mysqld_status check_alive nowarn; then log_progress_msg "already running" log_end_msg 0 else # Could be removed during boot test -e /var/run/mysqld || install -m 755 -o mysql -g root -d /var/run/mysqld # Start MySQL! su - mysql -s /bin/sh -c "/usr/bin/mysqld_safe > /dev/null 2>&1 &" # 6s was reported in #352070 to be too few when using ndbcluster # 14s was reported in #736452 to be too few with large installs for i in $(seq 1 30); do sleep 1 if mysqld_status check_alive nowarn ; then break; fi log_progress_msg "." done if mysqld_status check_alive warn; then log_end_msg 0 # Now start mysqlcheck or whatever the admin wants. output=$(/etc/mysql/debian-start) [ -n "$output" ] && log_action_msg "$output" else log_end_msg 1 log_failure_msg "Please take a look at the syslog" fi fi ;; 'stop') # * As a passwordless mysqladmin (eg via ~/.my.cnf) must be possible # at least for cron, we can rely on it here, too. (although we have # to specify it explicit as eg sudo environments points to the normal # users home and not /root) log_daemon_msg "Stopping MySQL database server" "mysqld" if ! mysqld_status check_dead nowarn; then set +e shutdown_out=`$MYADMIN shutdown 2>&1`; r=$? set -e if [ "$r" -ne 0 ]; then log_end_msg 1 [ "$VERBOSE" != "no" ] && log_failure_msg "Error: $shutdown_out" log_daemon_msg "Killing MySQL database server by signal" "mysqld" killall -15 mysqld server_down= for i in 1 2 3 4 5 6 7 8 9 10; do sleep 1 if mysqld_status check_dead nowarn; then server_down=1; break; fi done if test -z "$server_down"; then killall -9 mysqld; fi fi fi if ! mysqld_status check_dead warn; then log_end_msg 1 log_failure_msg "Please stop MySQL manually and read /usr/share/doc/mysql-server-5.6/README.Debian.gz!" exit -1 else log_end_msg 0 fi ;; 'restart') set +e; $SELF stop; set -e $SELF start ;; 'reload'|'force-reload') log_daemon_msg "Reloading MySQL database server" "mysqld" $MYADMIN reload log_end_msg 0 ;; 'status') if mysqld_status check_alive nowarn; then log_action_msg "$($MYADMIN version)" else log_action_msg "MySQL is stopped." exit 3 fi ;; *) echo "Usage: $SELF start|stop|restart|reload|force-reload|status" exit 1 ;; esac 

听起来像它可能被设置在mysqld_safe曾经有一个关于这个的古老的bug

从无限循环中调用mysqld_safe调用mysqld 。

转到操作系统并运行以下命令:

 grep -n nice `which mysqld_safe` 

这会告诉你所有的地方设置好,默认和使用

我只是在运行MySQL 5.5.20的CentOS虚拟机上运行它

 [~]# cat /etc/redhat-release CentOS release 5.7 (Final) [~]# mysql --version mysql Ver 14.14 Distrib 5.5.20, for Linux (x86_64) using readline 5.1 [~]# grep -n nice `which mysqld_safe` 17:niceness=0 56: --nice=NICE Set the scheduling priority of mysqld 200: --nice=*) niceness="$val" ;; 629:if test $niceness -eq 0 633: NOHUP_NICENESS="nohup nice -$niceness" 636:# Using nice with no args to get the niceness level is GNU-specific. 638:# BSD could use "nohup sh -c 'ps -o nice -p $$' | tail -1"). 641:if nohup nice > /dev/null 2>&1 643: normal_niceness=`nice` 644: nohup_niceness=`nohup nice 2>/dev/null` 646: numeric_nice_values=1 647: for val in $normal_niceness $nohup_niceness 654: numeric_nice_values=0 ;; 658: if test $numeric_nice_values -eq 1 660: nice_value_diff=`expr $nohup_niceness - $normal_niceness` 661: if test $? -eq 0 && test $nice_value_diff -gt 0 && \ 662: nice --$nice_value_diff echo testing > /dev/null 2>&1 667: niceness=`expr $niceness - $nice_value_diff` 668: NOHUP_NICENESS="nice -$niceness nohup" 

看看是否第一次出现的好(在这种情况下,好)被设置为19。

你也可以在mysqld_safe脚本中使用 grep 19。

我从来没有听说过随机设置的漂亮之前。 不过,我会从mysqld_safe开始

请记住,mysqld可能已经作为nohup与善良推出。

根据维基百科上好

nice是一个在Unix和类Unix操作系统(如Linux)上发现的程序。 它直接映射到相同名称的内核调用。 nice用于调用具有特定优先级的实用程序或shell脚本,从而使进程的CPU时间比其他进程多或less。 -20的优先级是最高优先级,19或20优先级最低。 进程的默认好处是从其父进程inheritance的,通常为0。

注意最后一句话

进程的默认好处是从其父进程inheritance的,通常为0。

这听起来令人不安,因为mysqld可能会重新inheritance原来的好价值。 谁是mysqld的父母? 就像我在开始时所说:这是mysqld_safe 。

你也应该确保你的操作系统没有运行在19好。 只需运行很好找出。

另外,请注意好用的消息

 [~]# nice --help Usage: nice [OPTION] [COMMAND [ARG]...] Run COMMAND with an adjusted niceness, which affects process scheduling. With no COMMAND, print the current niceness. Nicenesses range from -20 (most favorable scheduling) to 19 (least favorable). -n, --adjustment=N add integer N to the niceness (default 10) --help display this help and exit --version output version information and exit NOTE: your shell may have its own version of nice, which usually supersedes the version described here. Please refer to your shell's documentation for details about the options it supports.** Report bugs to <[email protected]>. 

基于前面提到的NOTE: ,你的shell很棒可能会有问题。 如果mysqld_safe从上面inheritance了它的好处,那么mysqld将会被祖父的好意所盛装