From 10cd657705606f9e3059f59cd5301cfd9868d977 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dani=C3=ABl=20van=20Eeden?= Date: Wed, 16 Nov 2022 08:41:56 +0100 Subject: [PATCH] Add details about sysbench and the SQL Plan Cache (#11011) --- benchmark/benchmark-tidb-using-sysbench.md | 26 ++++++--------------- media/performance/sql_plan_cache.png | Bin 0 -> 47427 bytes sql-prepared-plan-cache.md | 12 +++++++++- 3 files changed, 18 insertions(+), 20 deletions(-) create mode 100644 media/performance/sql_plan_cache.png diff --git a/benchmark/benchmark-tidb-using-sysbench.md b/benchmark/benchmark-tidb-using-sysbench.md index 5e3b45ceac4dd..23659bdda21a3 100644 --- a/benchmark/benchmark-tidb-using-sysbench.md +++ b/benchmark/benchmark-tidb-using-sysbench.md @@ -5,7 +5,7 @@ aliases: ['/docs/dev/benchmark/benchmark-tidb-using-sysbench/','/docs/dev/benchm # How to Test TiDB Using Sysbench -It is recommended to use Sysbench 1.0 or later, which can be [downloaded here](https://github.com/akopytov/sysbench/releases/tag/1.0.14). +It is recommended to use Sysbench 1.0 or later, which can be [downloaded here](https://github.com/akopytov/sysbench/releases/tag/1.0.20). ## Test plan @@ -19,6 +19,8 @@ server_configs: log.level: "error" ``` +It is also recommended to make sure [`tidb_enable_prepared_plan_cache`](/system-variables.md#tidb_enable_prepared_plan_cache-new-in-v610) is enabled and that you allow sysbench to use prepared statements by _not_ using `--db-ps-mode=disabled`. See the [SQL Prepared Execution Plan Cache](/sql-prepared-plan-cache.md) for documetnation about what the SQL plan cache does and how to monitor it. + ### TiKV configuration Higher log level also means better performance for TiKV. @@ -109,10 +111,10 @@ Restart MySQL client and execute the following SQL statement to create a databas create database sbtest; ``` -Adjust the order in which Sysbench scripts create indexes. Sysbench imports data in the order of "Build Table -> Insert Data -> Create Index", which takes more time for TiDB to import data. Users can adjust the order to speed up the import of data. Suppose that you use the Sysbench version [1.0.14](https://github.com/akopytov/sysbench/tree/1.0.14). You can adjust the order in either of the following two ways: +Adjust the order in which Sysbench scripts create indexes. Sysbench imports data in the order of "Build Table -> Insert Data -> Create Index", which takes more time for TiDB to import data. Users can adjust the order to speed up the import of data. Suppose that you use the Sysbench version [1.0.20](https://github.com/akopytov/sysbench/tree/1.0.20). You can adjust the order in either of the following two ways: - Download the modified [oltp_common.lua](https://raw.githubusercontent.com/pingcap/tidb-bench/master/sysbench/sysbench-patch/oltp_common.lua) file for TiDB and overwrite the `/usr/share/sysbench/oltp_common.lua` file with it. -- In `/usr/share/sysbench/oltp_common.lua`, move the lines [235](https://github.com/akopytov/sysbench/blob/1.0.14/src/lua/oltp_common.lua#L235)-[240](https://github.com/akopytov/sysbench/blob/1.0.14/src/lua/oltp_common.lua#L240) to be right behind the line 198. +- In `/usr/share/sysbench/oltp_common.lua`, move the lines [235-240](https://github.com/akopytov/sysbench/blob/1.0.20/src/lua/oltp_common.lua#L235-L240) to be right behind the line 198. > **Note:** > @@ -130,22 +132,8 @@ sysbench --config-file=config oltp_point_select --tables=32 --table-size=1000000 To warm data, we load data from disk into the block cache of memory. The warmed data has significantly improved the overall performance of the system. It is recommended to warm data once after restarting the cluster. -Sysbench 1.0.14 does not provide data warming, so it must be done manually. If you are using [Sysbench of the master version](https://github.com/akopytov/sysbench/tree/master), you can use the data warming feature included in the tool itself. - -Take a table sbtest7 in Sysbench as an example. Execute the following SQL to warming up data: - -{{< copyable "sql" >}} - -```sql -SELECT COUNT(pad) FROM sbtest7 USE INDEX (k_7); -``` - -Collecting statistics helps the optimizer choose a more accurate execution plan. The `analyze` command can be used to collect statistics on the table sbtest. Each table needs statistics. - -{{< copyable "sql" >}} - -```sql -ANALYZE TABLE sbtest7; +```bash +sysbench --config-file=config oltp_point_select --tables=32 --table-size=10000000 warmup ``` ### Point select test command diff --git a/media/performance/sql_plan_cache.png b/media/performance/sql_plan_cache.png new file mode 100644 index 0000000000000000000000000000000000000000..a74ef68fd104ad887a56c6d3d79634d09f05fdcf GIT binary patch literal 47427 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 select @@last_plan_from_cache; -- Reuse the last plan | 1 | +------------------------+ 1 row in set (0.00 sec) -``` \ No newline at end of file +``` + + + +### Monitoring + +In [the Grafana dashboard](/grafana-tidb-dashboard.md) on the TiDB page in the **Executor** section, there are the "Queries Using Plan Cache OPS" and "Plan Cache Miss OPS" graphs. These graphs can be used to check if both TiDB and the application are configured correctly to allow the SQL Plan Cache to work correctly. The **Server** section on the same page provides the "Prepared Statement Count" graph. This graph shows a non-zero value if the application uses prepared statements, which is required for the SQL Plan Cache to function correctly. + +![`sql_plan_cache`](/media/performance/sql_plan_cache.png) + +