mirror of
				https://github.com/MariaDB/server.git
				synced 2025-11-03 20:36:16 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			315 lines
		
	
	
	
		
			10 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			315 lines
		
	
	
	
		
			10 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
/* Copyright (c) 2012, 2023, Oracle and/or its affiliates.
 | 
						|
 | 
						|
  This program is free software; you can redistribute it and/or modify
 | 
						|
  it under the terms of the GNU General Public License, version 2.0,
 | 
						|
  as published by the Free Software Foundation.
 | 
						|
 | 
						|
  This program is also distributed with certain software (including
 | 
						|
  but not limited to OpenSSL) that is licensed under separate terms,
 | 
						|
  as designated in a particular file or component or in included license
 | 
						|
  documentation.  The authors of MySQL hereby grant you an additional
 | 
						|
  permission to link the program and your derivative works with the
 | 
						|
  separately licensed software that they have included with MySQL.
 | 
						|
 | 
						|
  This program 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, version 2.0, for more details.
 | 
						|
 | 
						|
  You should have received a copy of the GNU General Public License
 | 
						|
  along with this program; if not, write to the Free Software Foundation,
 | 
						|
  51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA */
 | 
						|
 | 
						|
/**
 | 
						|
  @file storage/perfschema/pfs_autosize.cc
 | 
						|
  Private interface for the server (implementation).
 | 
						|
*/
 | 
						|
 | 
						|
#include "my_global.h"
 | 
						|
#include "sql_const.h"
 | 
						|
#include "pfs_server.h"
 | 
						|
#include "set_var.h"
 | 
						|
 | 
						|
#include "my_thread.h" /* For pthread_t */
 | 
						|
/* Make sure HAVE_PSI_XXX_INTERFACE flags are set */
 | 
						|
#include "mysql/psi/psi.h"
 | 
						|
 | 
						|
#include <algorithm>
 | 
						|
using std::min;
 | 
						|
using std::max;
 | 
						|
 | 
						|
/** Performance schema sizing heuristics. */
 | 
						|
struct PFS_sizing_data
 | 
						|
{
 | 
						|
  /** Default value for @c PFS_param.m_events_waits_history_sizing. */
 | 
						|
  ulong m_events_waits_history_sizing;
 | 
						|
  /** Default value for @c PFS_param.m_events_waits_history_long_sizing. */
 | 
						|
  ulong m_events_waits_history_long_sizing;
 | 
						|
  /** Default value for @c PFS_param.m_events_stages_history_sizing. */
 | 
						|
  ulong m_events_stages_history_sizing;
 | 
						|
  /** Default value for @c PFS_param.m_events_stages_history_long_sizing. */
 | 
						|
  ulong m_events_stages_history_long_sizing;
 | 
						|
  /** Default value for @c PFS_param.m_events_statements_history_sizing. */
 | 
						|
  ulong m_events_statements_history_sizing;
 | 
						|
  /** Default value for @c PFS_param.m_events_statements_history_long_sizing. */
 | 
						|
  ulong m_events_statements_history_long_sizing;
 | 
						|
  /** Default value for @c PFS_param.m_events_transactions_history_sizing. */
 | 
						|
  ulong m_events_transactions_history_sizing;
 | 
						|
  /** Default value for @c PFS_param.m_events_transactions_history_long_sizing. */
 | 
						|
  ulong m_events_transactions_history_long_sizing;
 | 
						|
  /** Default value for @c PFS_param.m_digest_sizing. */
 | 
						|
  ulong m_digest_sizing;
 | 
						|
  /** Default value for @c PFS_param.m_session_connect_attrs_sizing. */
 | 
						|
  ulong m_session_connect_attrs_sizing;
 | 
						|
};
 | 
						|
 | 
						|
PFS_sizing_data small_data=
 | 
						|
{
 | 
						|
  /* History sizes */
 | 
						|
  5, 100, 5, 100, 5, 100, 5, 100,
 | 
						|
  /* Digests */
 | 
						|
  1000,
 | 
						|
  /* Session connect attrs. */
 | 
						|
  512
 | 
						|
};
 | 
						|
 | 
						|
PFS_sizing_data medium_data=
 | 
						|
{
 | 
						|
  /* History sizes */
 | 
						|
  10, 1000, 10, 1000, 10, 1000, 10, 1000,
 | 
						|
  /* Digests */
 | 
						|
  5000,
 | 
						|
  /* Session connect attrs. */
 | 
						|
  512
 | 
						|
};
 | 
						|
 | 
						|
PFS_sizing_data large_data=
 | 
						|
{
 | 
						|
  /* History sizes */
 | 
						|
  10, 10000, 10, 10000, 10, 10000, 10, 10000,
 | 
						|
  /* Digests */
 | 
						|
  10000,
 | 
						|
  /* Session connect attrs. */
 | 
						|
  512
 | 
						|
};
 | 
						|
 | 
						|
PFS_sizing_data *estimate_hints(PFS_global_param *param)
 | 
						|
{
 | 
						|
  if ((param->m_hints.m_max_connections <= MAX_CONNECTIONS_DEFAULT) &&
 | 
						|
      (param->m_hints.m_table_definition_cache <= TABLE_DEF_CACHE_DEFAULT) &&
 | 
						|
      (param->m_hints.m_table_open_cache <= TABLE_OPEN_CACHE_DEFAULT))
 | 
						|
  {
 | 
						|
    /* The my.cnf used is either unchanged, or lower than factory defaults. */
 | 
						|
    return & small_data;
 | 
						|
  }
 | 
						|
 | 
						|
  if ((param->m_hints.m_max_connections <= MAX_CONNECTIONS_DEFAULT * 2) &&
 | 
						|
      (param->m_hints.m_table_definition_cache <= TABLE_DEF_CACHE_DEFAULT * 2) &&
 | 
						|
      (param->m_hints.m_table_open_cache <= TABLE_OPEN_CACHE_DEFAULT * 2))
 | 
						|
  {
 | 
						|
    /* Some defaults have been increased, to "moderate" values. */
 | 
						|
    return & medium_data;
 | 
						|
  }
 | 
						|
 | 
						|
  /* Looks like a server in production. */
 | 
						|
  return & large_data;
 | 
						|
}
 | 
						|
 | 
						|
static void apply_heuristic(PFS_global_param *p, PFS_sizing_data *h)
 | 
						|
{
 | 
						|
  if (p->m_events_waits_history_sizing < 0)
 | 
						|
  {
 | 
						|
    SYSVAR_AUTOSIZE(p->m_events_waits_history_sizing,
 | 
						|
                    h->m_events_waits_history_sizing);
 | 
						|
  }
 | 
						|
 | 
						|
  if (p->m_events_waits_history_long_sizing < 0)
 | 
						|
  {
 | 
						|
    SYSVAR_AUTOSIZE(p->m_events_waits_history_long_sizing,
 | 
						|
                    h->m_events_waits_history_long_sizing);
 | 
						|
  }
 | 
						|
 | 
						|
  if (p->m_events_stages_history_sizing < 0)
 | 
						|
  {
 | 
						|
    SYSVAR_AUTOSIZE(p->m_events_stages_history_sizing,
 | 
						|
                    h->m_events_stages_history_sizing);
 | 
						|
  }
 | 
						|
 | 
						|
  if (p->m_events_stages_history_long_sizing < 0)
 | 
						|
  {
 | 
						|
    SYSVAR_AUTOSIZE(p->m_events_stages_history_long_sizing,
 | 
						|
                    h->m_events_stages_history_long_sizing);
 | 
						|
  }
 | 
						|
 | 
						|
  if (p->m_events_statements_history_sizing < 0)
 | 
						|
  {
 | 
						|
    SYSVAR_AUTOSIZE(p->m_events_statements_history_sizing,
 | 
						|
                    h->m_events_statements_history_sizing);
 | 
						|
  }
 | 
						|
 | 
						|
  if (p->m_events_statements_history_long_sizing < 0)
 | 
						|
  {
 | 
						|
    SYSVAR_AUTOSIZE(p->m_events_statements_history_long_sizing,
 | 
						|
                    h->m_events_statements_history_long_sizing);
 | 
						|
  }
 | 
						|
 | 
						|
  if (p->m_digest_sizing < 0)
 | 
						|
  {
 | 
						|
    SYSVAR_AUTOSIZE(p->m_digest_sizing,
 | 
						|
                    h->m_digest_sizing);
 | 
						|
  }
 | 
						|
 | 
						|
  if (p->m_events_transactions_history_sizing < 0)
 | 
						|
  {
 | 
						|
    SYSVAR_AUTOSIZE(p->m_events_transactions_history_sizing,
 | 
						|
                    h->m_events_transactions_history_sizing);
 | 
						|
  }
 | 
						|
 | 
						|
  if (p->m_events_transactions_history_long_sizing < 0)
 | 
						|
  {
 | 
						|
    SYSVAR_AUTOSIZE(p->m_events_transactions_history_long_sizing,
 | 
						|
                    h->m_events_transactions_history_long_sizing);
 | 
						|
  }
 | 
						|
 | 
						|
  if (p->m_session_connect_attrs_sizing < 0)
 | 
						|
  {
 | 
						|
    SYSVAR_AUTOSIZE(p->m_session_connect_attrs_sizing,
 | 
						|
                    h->m_session_connect_attrs_sizing);
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
void pfs_automated_sizing(PFS_global_param *param)
 | 
						|
{
 | 
						|
  if (param->m_enabled)
 | 
						|
  {
 | 
						|
#ifndef HAVE_PSI_MUTEX_INTERFACE
 | 
						|
    param->m_mutex_class_sizing= 0;
 | 
						|
    param->m_mutex_sizing= 0;
 | 
						|
#endif
 | 
						|
 | 
						|
#ifndef HAVE_PSI_RWLOCK_INTERFACE
 | 
						|
    param->m_rwlock_class_sizing= 0;
 | 
						|
    param->m_rwlock_sizing= 0;
 | 
						|
#endif
 | 
						|
 | 
						|
#ifndef HAVE_PSI_COND_INTERFACE
 | 
						|
    param->m_cond_class_sizing= 0;
 | 
						|
    param->m_cond_sizing= 0;
 | 
						|
#endif
 | 
						|
 | 
						|
#ifndef HAVE_PSI_FILE_INTERFACE
 | 
						|
    param->m_file_class_sizing= 0;
 | 
						|
    param->m_file_sizing= 0;
 | 
						|
    param->m_file_handle_sizing= 0;
 | 
						|
#endif
 | 
						|
 | 
						|
#ifndef HAVE_PSI_TABLE_INTERFACE
 | 
						|
    param->m_table_share_sizing= 0;
 | 
						|
    param->m_table_sizing= 0;
 | 
						|
    param->m_table_lock_stat_sizing= 0;
 | 
						|
    param->m_index_stat_sizing= 0;
 | 
						|
#endif
 | 
						|
 | 
						|
#ifndef HAVE_PSI_SOCKET_INTERFACE
 | 
						|
    param->m_socket_class_sizing= 0;
 | 
						|
    param->m_socket_sizing= 0;
 | 
						|
#endif
 | 
						|
 | 
						|
#ifndef HAVE_PSI_STAGE_INTERFACE
 | 
						|
    param->m_stage_class_sizing= 0;
 | 
						|
    param->m_events_stages_history_sizing= 0;
 | 
						|
    param->m_events_stages_history_long_sizing= 0;
 | 
						|
#endif
 | 
						|
 | 
						|
#ifndef HAVE_PSI_STATEMENT_INTERFACE
 | 
						|
    param->m_statement_class_sizing= 0;
 | 
						|
    param->m_events_statements_history_sizing= 0;
 | 
						|
    param->m_events_statements_history_long_sizing= 0;
 | 
						|
#endif
 | 
						|
 | 
						|
#ifndef HAVE_PSI_SP_INTERFACE
 | 
						|
    param->m_program_sizing= 0;
 | 
						|
    if (param->m_statement_stack_sizing > 1)
 | 
						|
      param->m_statement_stack_sizing= 1;
 | 
						|
#endif
 | 
						|
 | 
						|
#ifndef HAVE_PSI_PS_INTERFACE
 | 
						|
    param->m_prepared_stmt_sizing= 0;
 | 
						|
#endif
 | 
						|
 | 
						|
#ifndef HAVE_PSI_STATEMENT_DIGEST_INTERFACE
 | 
						|
    param->m_digest_sizing= 0;
 | 
						|
#endif
 | 
						|
 | 
						|
#ifndef HAVE_PSI_METADATA_INTERFACE
 | 
						|
    param->m_metadata_lock_sizing= 0;
 | 
						|
#endif
 | 
						|
 | 
						|
#ifndef HAVE_PSI_MEMORY_INTERFACE
 | 
						|
    param->m_memory_class_sizing= 0;
 | 
						|
#endif
 | 
						|
 | 
						|
    PFS_sizing_data *heuristic;
 | 
						|
    heuristic= estimate_hints(param);
 | 
						|
    apply_heuristic(param, heuristic);
 | 
						|
 | 
						|
    assert(param->m_events_waits_history_sizing >= 0);
 | 
						|
    assert(param->m_events_waits_history_long_sizing >= 0);
 | 
						|
    assert(param->m_events_stages_history_sizing >= 0);
 | 
						|
    assert(param->m_events_stages_history_long_sizing >= 0);
 | 
						|
    assert(param->m_events_statements_history_sizing >= 0);
 | 
						|
    assert(param->m_events_statements_history_long_sizing >= 0);
 | 
						|
    assert(param->m_events_transactions_history_sizing >= 0);
 | 
						|
    assert(param->m_events_transactions_history_long_sizing >= 0);
 | 
						|
    assert(param->m_session_connect_attrs_sizing >= 0);
 | 
						|
  }
 | 
						|
  else
 | 
						|
  {
 | 
						|
    /*
 | 
						|
      The Performance Schema is disabled. Set the instrument sizings to zero to
 | 
						|
      disable all instrumentation while retaining support for the status and
 | 
						|
      system variable tables, the host cache table and the replication tables.
 | 
						|
    */
 | 
						|
    SYSVAR_AUTOSIZE(param->m_mutex_class_sizing, 0);
 | 
						|
    SYSVAR_AUTOSIZE(param->m_rwlock_class_sizing, 0);
 | 
						|
    SYSVAR_AUTOSIZE(param->m_cond_class_sizing, 0);
 | 
						|
    SYSVAR_AUTOSIZE(param->m_thread_class_sizing, 0);
 | 
						|
    SYSVAR_AUTOSIZE(param->m_table_share_sizing, 0);
 | 
						|
    SYSVAR_AUTOSIZE(param->m_table_lock_stat_sizing, 0);
 | 
						|
    SYSVAR_AUTOSIZE(param->m_index_stat_sizing, 0);
 | 
						|
    SYSVAR_AUTOSIZE(param->m_file_class_sizing, 0);
 | 
						|
    SYSVAR_AUTOSIZE(param->m_mutex_sizing, 0);
 | 
						|
    SYSVAR_AUTOSIZE(param->m_rwlock_sizing, 0);
 | 
						|
    SYSVAR_AUTOSIZE(param->m_cond_sizing, 0);
 | 
						|
    SYSVAR_AUTOSIZE(param->m_thread_sizing, 0);
 | 
						|
    SYSVAR_AUTOSIZE(param->m_table_sizing, 0);
 | 
						|
    SYSVAR_AUTOSIZE(param->m_file_sizing, 0);
 | 
						|
    SYSVAR_AUTOSIZE(param->m_file_handle_sizing, 0);
 | 
						|
    SYSVAR_AUTOSIZE(param->m_socket_sizing, 0);
 | 
						|
    SYSVAR_AUTOSIZE(param->m_socket_class_sizing, 0);
 | 
						|
    SYSVAR_AUTOSIZE(param->m_events_waits_history_sizing, 0);
 | 
						|
    SYSVAR_AUTOSIZE(param->m_events_waits_history_long_sizing, 0);
 | 
						|
    SYSVAR_AUTOSIZE(param->m_setup_actor_sizing, 0);
 | 
						|
    SYSVAR_AUTOSIZE(param->m_setup_object_sizing, 0);
 | 
						|
    SYSVAR_AUTOSIZE(param->m_host_sizing, 0);
 | 
						|
    SYSVAR_AUTOSIZE(param->m_user_sizing, 0);
 | 
						|
    SYSVAR_AUTOSIZE(param->m_account_sizing, 0);
 | 
						|
    SYSVAR_AUTOSIZE(param->m_stage_class_sizing, 0);
 | 
						|
    SYSVAR_AUTOSIZE(param->m_events_stages_history_sizing, 0);
 | 
						|
    SYSVAR_AUTOSIZE(param->m_events_stages_history_long_sizing, 0);
 | 
						|
    SYSVAR_AUTOSIZE(param->m_statement_class_sizing, 0);
 | 
						|
    SYSVAR_AUTOSIZE(param->m_events_statements_history_sizing, 0);
 | 
						|
    SYSVAR_AUTOSIZE(param->m_events_statements_history_long_sizing, 0);
 | 
						|
    SYSVAR_AUTOSIZE(param->m_digest_sizing, 0);
 | 
						|
    SYSVAR_AUTOSIZE(param->m_program_sizing, 0);
 | 
						|
    SYSVAR_AUTOSIZE(param->m_prepared_stmt_sizing, 0);
 | 
						|
    SYSVAR_AUTOSIZE(param->m_events_transactions_history_sizing, 0);
 | 
						|
    SYSVAR_AUTOSIZE(param->m_events_transactions_history_long_sizing, 0);
 | 
						|
    SYSVAR_AUTOSIZE(param->m_session_connect_attrs_sizing, 0);
 | 
						|
    SYSVAR_AUTOSIZE(param->m_statement_stack_sizing, 0);
 | 
						|
    SYSVAR_AUTOSIZE(param->m_memory_class_sizing, 0);
 | 
						|
    SYSVAR_AUTOSIZE(param->m_metadata_lock_sizing, 0);
 | 
						|
    SYSVAR_AUTOSIZE(param->m_max_digest_length, 0);
 | 
						|
    SYSVAR_AUTOSIZE(param->m_max_sql_text_length, 0);
 | 
						|
  }
 | 
						|
}
 |