mirror of
https://github.com/MariaDB/server.git
synced 2025-01-16 03:52:35 +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);
|
|
}
|
|
}
|