mirror of
https://github.com/MariaDB/server.git
synced 2025-08-08 11:22:35 +03:00
Bug#24795: Add SHOW PROFILE
Patch contributed by Jeremy Cole. CLA received Oct 2006 by Kaj Arnö Add rudimentary query profiling support. libmysqld/Makefile.am: Add profile file to source list. sql/Makefile.am: Add profiling files to source and header lists. sql/ha_archive.cc: Macro-ized other discovered instances of setting proc_info. sql/ha_myisam.cc: Macroize setting thread-state info sql/item_func.cc: Macro-ized other discovered instances of setting proc_info. sql/lex.h: Add lexer info for profiling. sql/lock.cc: Macroize setting thread-state info sql/log_event.cc: Macro-ized other discovered instances of setting proc_info. sql/mysql_priv.h: Set constants for profiling. sql/repl_failsafe.cc: Macro-ized other discovered instances of setting proc_info. sql/slave.cc: Macro-ized other discovered instances of setting proc_info. sql/sp_head.cc: Macro-ized other discovered instances of setting proc_info. sql/sql_base.cc: Macroize setting thread-state info --- Macro-ized other discovered instances of setting proc_info. sql/sql_cache.cc: Macroize setting thread-state info sql/sql_class.cc: Integrate profiling. sql/sql_class.h: Instantiate profiling object. sql/sql_delete.cc: Macroize setting thread-state info sql/sql_insert.cc: Macroize setting thread-state info --- Macro-ized other discovered instances of setting proc_info. sql/sql_lex.cc: Initialize profiling. sql/sql_lex.h: Define lex tokens and allocate space for profiling options. sql/sql_parse.cc: Integrate profiling. --- Macro-ized other discovered instances of setting proc_info. sql/sql_repl.cc: Macro-ized other discovered instances of setting proc_info. sql/sql_select.cc: Macroize setting thread-state info. Clean up some lines. sql/sql_show.cc: Macro-ized other discovered instances of setting proc_info. --- Revert bad use of macro. sql/sql_table.cc: Macroize setting thread-state info sql/sql_update.cc: Macroize setting thread-state info sql/sql_view.cc: Macro-ized other discovered instances of setting proc_info. sql/sql_yacc.yy: Add parser info for profiling. --- Fix new YACC shift/reduce conflict. (Now at 249.) mysql-test/r/profile.result: Test profiling code. --- A not-very-useful result. mysql-test/t/profile.test: Test profiling code. --- Test syntax, but not values of profiles code. sql/sql_profile.cc: Add profiling code. --- Add wishlist comment. sql/sql_profile.h: Add profiling code. --- Changed the value of the macro so that it's syntactically equivalent to a single statement.
This commit is contained in:
187
sql/sql_profile.h
Normal file
187
sql/sql_profile.h
Normal file
@@ -0,0 +1,187 @@
|
||||
/* Copyright (C) 2005 MySQL AB
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
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 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, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
|
||||
|
||||
#ifndef SQL_PROFILE_H
|
||||
#define SQL_PROFILE_H
|
||||
|
||||
#include <sys/time.h>
|
||||
#include <sys/resource.h>
|
||||
|
||||
#if 1
|
||||
#define THD_PROC_INFO(thd, msg) do { if(unlikely((thd)->profiling.enabled)) { (thd)->profiling.status((msg), __FUNCTION__, __FILE__, __LINE__); } else { (thd)->proc_info= (msg); } } while (0)
|
||||
#else
|
||||
#define THD_PROC_INFO(thd, msg) do { (thd)->proc_info= (msg); } while (0)
|
||||
#endif
|
||||
|
||||
#if 0
|
||||
|
||||
struct rusage {
|
||||
struct timeval ru_utime; /* user time used */
|
||||
struct timeval ru_stime; /* system time used */
|
||||
long ru_maxrss; /* integral max resident set size */
|
||||
long ru_ixrss; /* integral shared text memory size */
|
||||
long ru_idrss; /* integral unshared data size */
|
||||
long ru_isrss; /* integral unshared stack size */
|
||||
long ru_minflt; /* page reclaims */
|
||||
long ru_majflt; /* page faults */
|
||||
long ru_nswap; /* swaps */
|
||||
long ru_inblock; /* block input operations */
|
||||
long ru_oublock; /* block output operations */
|
||||
long ru_msgsnd; /* messages sent */
|
||||
long ru_msgrcv; /* messages received */
|
||||
long ru_nsignals; /* signals received */
|
||||
long ru_nvcsw; /* voluntary context switches */
|
||||
long ru_nivcsw; /* involuntary context switches */
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
#define PROFILE_NONE 0
|
||||
#define PROFILE_CPU 1
|
||||
#define PROFILE_MEMORY 2
|
||||
#define PROFILE_BLOCK_IO 4
|
||||
#define PROFILE_CONTEXT 8
|
||||
#define PROFILE_PAGE_FAULTS 16
|
||||
#define PROFILE_IPC 32
|
||||
#define PROFILE_SWAPS 64
|
||||
#define PROFILE_SOURCE 16384
|
||||
#define PROFILE_ALL 32767
|
||||
|
||||
class PROFILE_ENTRY;
|
||||
class PROFILE;
|
||||
class PROFILING;
|
||||
|
||||
/*
|
||||
A single entry in a single profile.
|
||||
*/
|
||||
|
||||
class PROFILE_ENTRY: public Sql_alloc
|
||||
{
|
||||
public:
|
||||
PROFILE *profile;
|
||||
char *status;
|
||||
ulonglong time;
|
||||
struct rusage rusage;
|
||||
|
||||
char *function;
|
||||
char *file;
|
||||
unsigned int line;
|
||||
|
||||
PROFILE_ENTRY();
|
||||
PROFILE_ENTRY(PROFILE *profile_arg, const char *status_arg);
|
||||
PROFILE_ENTRY(PROFILE *profile_arg, const char *status_arg,
|
||||
const char *function_arg,
|
||||
const char *file_arg, unsigned int line_arg);
|
||||
~PROFILE_ENTRY();
|
||||
|
||||
void set_status(const char *status_arg);
|
||||
void collect();
|
||||
};
|
||||
|
||||
/*
|
||||
The full profile for a single query. Includes multiple PROFILE_ENTRY
|
||||
objects.
|
||||
*/
|
||||
|
||||
class PROFILE: public Sql_alloc
|
||||
{
|
||||
public:
|
||||
PROFILING *profiling;
|
||||
query_id_t query_id;
|
||||
PROFILE_ENTRY profile_start;
|
||||
PROFILE_ENTRY *profile_end;
|
||||
List<PROFILE_ENTRY> entries;
|
||||
|
||||
PROFILE(PROFILING *profiling_arg);
|
||||
~PROFILE();
|
||||
|
||||
/* Add a profile status change to the current profile. */
|
||||
void status(const char *status_arg,
|
||||
const char *function_arg,
|
||||
const char *file_arg, unsigned int line_arg);
|
||||
|
||||
/* Reset the contents of this profile entry. */
|
||||
void reset();
|
||||
|
||||
/* Show this profile. This is called by PROFILING. */
|
||||
bool show(uint options);
|
||||
};
|
||||
|
||||
/*
|
||||
Profiling state for a single THD. Contains multiple PROFILE objects.
|
||||
*/
|
||||
|
||||
class PROFILING: public Sql_alloc
|
||||
{
|
||||
public:
|
||||
MEM_ROOT root;
|
||||
THD *thd;
|
||||
bool enabled;
|
||||
bool keeping;
|
||||
|
||||
PROFILE *current;
|
||||
PROFILE *last;
|
||||
List<PROFILE> history;
|
||||
|
||||
PROFILING();
|
||||
~PROFILING();
|
||||
|
||||
inline void set_thd(THD *thd_arg) { thd= thd_arg; };
|
||||
|
||||
/*
|
||||
Should we try to collect profiling information at all?
|
||||
|
||||
If we disable profiling, we cannot later decide to turn it back
|
||||
on for the same query.
|
||||
*/
|
||||
inline void enable() { enabled= 1; };
|
||||
inline void disable() { enabled= 0; };
|
||||
|
||||
/*
|
||||
Do we intend to keep the currently collected profile?
|
||||
|
||||
We don't keep profiles for some commands, such as SHOW PROFILE,
|
||||
SHOW PROFILES, and some SQLCOM commands which aren't useful to
|
||||
profile. The keep() and discard() functions can be called many
|
||||
times, only the final setting when the query finishes is used
|
||||
to decide whether to discard the profile.
|
||||
|
||||
The default is to keep the profile for all queries.
|
||||
*/
|
||||
inline void keep() { keeping= 1; };
|
||||
inline void discard() { keeping= 0; };
|
||||
|
||||
void status(const char *status_arg,
|
||||
const char *function_arg,
|
||||
const char *file_arg, unsigned int line_arg);
|
||||
|
||||
/* Stash this profile in the profile history. */
|
||||
void store();
|
||||
|
||||
/* Reset the current profile and state of profiling for the next query. */
|
||||
void reset();
|
||||
|
||||
/* SHOW PROFILES */
|
||||
bool show_profiles();
|
||||
|
||||
/* SHOW PROFILE FOR QUERY query_id */
|
||||
bool show(uint options, uint query_id);
|
||||
|
||||
/* SHOW PROFILE */
|
||||
bool show_last(uint options);
|
||||
};
|
||||
|
||||
#endif /* SQL_PROFILE_H */
|
Reference in New Issue
Block a user