Database advisor checks
SolarWinds Observability automatically reviews the settings of your host and monitored database instances and identifies settings that are inconsistent with established best practices. For clients with query samples enabled, SolarWinds Observability also proactively alerts you to possible query-writing and index optimizations. The Advisors tab on the Databases Overview displays the results of these tests, allowing you to quickly find areas where you can improve the performance and security of your database.
To access the Advisors tab, click Database > Advisors. Use the Advisors tab to view details about potential problems and optimization opportunities within your databases monitored with SolarWinds Observability.
View the advisor count in the Summary
The Advisors Summary details the total recommendation count, displaying the advisor checks that failed and are actionable to improve database best practices. The Advisors tab displays whether the advisor categories are informational (blue), critical (red), or cautionary (yellow). Critical recommendations should take priority, and require you to optimize an aspect of your database for improved database performance.
Advice categories are displayed beneath the Summary and provide you with recommendations grouped into specific database categories. Use the Advice categories to filter for specific database aspects that you may want to optimize. For example, you could expand the MySQL Configuration category to see any critical, cautionary, or informational recommendations. Each recommendation category has its own count, with listed recommendations underneath the category. Expand any recommendation to view affected database(s) by ID, their status, and an explanation of the recommendation. Click any database ID to filter the view for that database, and see all the advisor checks for that database.
Filter advisors
Apply filters to all available advisors with the severity filter drop down menu. Quickly filter all advisors to display only information, cautionary, or critical categories. Click the X in the severity filter dropdown to remove the applied filter.
Click the Hide passed checks checkbox to hide all occurrences that passed, and are within suggested database best practices.
View the available advisor checks
See the database specific sections for information about available advisor checks.
MongoDB Advisor checks
MongoDB checks are based on the official MongoDB documentation, which makes a number of configuration recommendations. Visit the more information links in the table below to continue to the MongoDB documentation.
MongoDB and OS configuration
Check | Metric name | Description | More information |
---|---|---|---|
Transparent huge pages | mongo.os.huge_pages
|
Transparent huge pages should be disabled on the server, as MongoDB generally performs better with normally sized virtual memory pages. |
https://docs.mongodb.com/manual/tutorial/transparent-huge-pages/ |
Journaling | mongo.os.journaling
|
Journaling should be enabled on the server to help avoid data loss in the case of a crash. | https://docs.mongodb.com/manual/administration/production-notes/#journaling |
Swap | mongo.os.swap
|
MongoDB recommends having some swap space configured to help avoid getting terminated by the OOM Killer when the server is under memory pressure. | https://docs.mongodb.com/manual/administration/production-checklist-operations/#operating-system-configuration |
TCP keepalive | mongo.net.tcp.keepalive
|
MongoDB recommends having a short keepalive time set for network connections, as this results in generally better performance for replica sets and sharded clusters. | https://docs.mongodb.com/manual/administration/production-checklist-operations/#replication |
Self resolution | mongo.net.resolve_self
|
When running in a replica set, it is important to ensure that the MongoDB server can resolve its own hostname. | https://docs.mongodb.com/manual/administration/production-checklist-operations/#replication |
Filehandle limit | mongo.limits.file_max
|
Ensure that MongoDB has enough file handles to handle your workload. For production systems a limit of 98,000 is usually reasonable. | https://docs.mongodb.com/manual/administration/production-checklist-operations/#operating-system-configuration |
Thread limit | mongo.limits.thread_max
|
Ensure the server has a high enough thread limit for your workload. For production systems a limit of 64,000 is usually reasonable. | https://docs.mongodb.com/manual/administration/production-checklist-operations/#operating-system-configuration |
PID limit | mongo.limits.pid_max
|
Ensure that the server has a high enough PID limit for your workload. For production systems a limit of 64,000 is usually reasonable. | https://docs.mongodb.com/manual/administration/production-checklist-operations/#operating-system-configuration |
Readahead settings | mongo.dbpath.fs.readahead
|
Ensure the readahead settings for your storage device are appropriate. For the WiredTiger storage engine, set readahead between 8 and 32 regardless of storage media type (spinning disk, SSD, etc.), unless testing shows a measurable, repeatable, and reliable benefit in a higher readahead value. For MMAPv1, consider a value of 32 or lower. | https://docs.mongodb.com/manual/administration/production-checklist-operations/#operating-system-configuration |
Disk scheduler | mongo.dbpath.fs.scheduler
|
Use the noop or deadline disk scheduler for the database’s storage device for maximum performance. | https://docs.mongodb.com/manual/administration/production-checklist-operations/#operating-system-configuration |
dbPath mount point | mongo.dbpath.fs.noatime
|
Use noatime for the dbPath mount point to improve performance. | https://docs.mongodb.com/manual/administration/production-checklist-operations/#operating-system-configuration |
Filesystem | mongo.dbpath.fs.type
|
The XFS filesystem is recommended with MongoDB as it provides generally better performance. For WiredTiger it is strongly recommended due to known performance problems with EXT4. | https://docs.mongodb.com/manual/administration/production-checklist-operations/#operating-system-configuration |
Index sizes | mongo.index.size
|
Ensure that each of your indexes fit entirely in memory so that the system can avoid reading the index from disk. | https://docs.mongodb.com/manual/tutorial/ensure-indexes-fit-ram/ |
Index total size | mongo.index.size
|
Ensure that all your indexes fit entirely in memory so that the system can avoid reading the index from disk. | https://docs.mongodb.com/manual/tutorial/ensure-indexes-fit-ram/ |
Collection sizes | mongo.collection.size
|
MongoDB recommends your working set should stay in memory to achieve good performance. | https://docs.mongodb.com/manual/faq/diagnostics/#must-my-working-set-size-fit-ram |
Total size | mongo.collection.total_size
|
MongoDB recommends the total size of your collections should stay in memory to achieve good performance. | https://docs.mongodb.com/manual/faq/diagnostics/#must-my-working-set-size-fit-ram |
MongoDB replication configuration
Check | Metric name | Description | More information |
---|---|---|---|
Hostnames | mongo.repl.hostnames
|
Use hostnames when configuring replica set members rather than IP-addresses, as it makes them easier to maintain in production. | https://docs.mongodb.com/manual/administration/production-checklist-operations/#sharding |
Cluster voting members | mongo.repl.voting_members
|
Ensure that the replica set has an odd number of voting members; otherwise during an election it may not be possible to reach a quorum successfully. | https://docs.mongodb.com/manual/administration/production-checklist-operations/#replication |
Cluster vote config | mongo.repl.allocated_votes
|
It is recommended that replica set members have either 0 or 1 votes allocated to them. | https://docs.mongodb.com/manual/administration/production-checklist-operations/#replication |
MongoDB security configuration
Check | Metric name | Description | More information |
---|---|---|---|
Authorization | mongo.security.authorization
|
Ensure that MongoDB is configured with role-based access control enabled so that specific user actions can be limited as necessary. | https://docs.mongodb.com/manual/administration/security-checklist/ |
Encryption | mongo.security.encryption
|
MongoDB enterprise edition supports at-rest encryption for the WiredTiger storage engine. Enabling this option is recommended to limit the possibility of data theft. | https://docs.mongodb.com/manual/administration/security-checklist/ |
Network exposure | mongo.security.net.exposure
|
Ensure that MongoDB’s HTTP status interface, REST API and JSON API are disabled to limit untrusted access to the database. | https://docs.mongodb.com/manual/administration/security-checklist/ |
Javascript | mongo.security.javascript
|
MongoDB supports the execution of JavaScript code for certain server operations; this should be disabled if possible to avoid unsafe use. | https://docs.mongodb.com/manual/administration/security-checklist/ |
MySQL Advisor checks
MySQL checks are based on the official MySQL documentation, which makes a number of configuration recommendations. Visit the more information links in the table below to continue to the MySQL documentation.
Check | Metric name | Description | More information |
---|---|---|---|
Anonymous users | mysql.security.anonymous_users
|
It is recommended to not run MySQL without usernames. | https://dev.mysql.com/doc/refman/5.7/en/default-privileges.html |
Server running as root | mysql.security.backend_is_root
|
MySQL should not be running with a user or group with root privileges. | https://dev.mysql.com/doc/refman/5.7/en/security-against-attack.html |
File system privileges | mysql.security.privileges
|
The MySQL server configuration file and data directory should not be world-writable. The slow query log file should not be world readable. | https://dev.mysql.com/doc/refman/5.7/en/security-against-attack.html |
Binary log durability | mysql.binlog_durability
|
Some values of the sync_binlog , binlog_checksum , innodb_locks_unsafe_for_binlog , and innodb_support_xa variables can reduce the durability of transactions in the binary log and result in data loss or corruption. |
https://dev.mysql.com/doc/refman/5.7/en/replication-options-binary-log.html https://dev.mysql.com/doc/refman/5.7/en/innodb-parameters.html |
File descriptor limits | mysql.file_descriptor_limits
|
MySQL’s file descriptor limit should be high enough to handle the configured number of open files, max connections, and open tables. Five times max_conections is a good starting point. |
https://dev.mysql.com/doc/refman/5.7/en/not-enough-file-handles.html |
Network exposure | mysql.network_exposure
|
MySQL should not be listening on a public IP. | https://dev.mysql.com/doc/refman/5.7/en/security-guidelines.html |
Performance Schema | mysql.offhost_performance_schema_disabled
|
Disabling the Performance Schema will affect DPM’s ability to monitor MySQL. | |
Query cache | mysql.query_cache
|
The query cache can cause occasional stalls which affect query performance. It’s recommended to disable this feature (except for Aurora). | https://dev.mysql.com/doc/refman/5.7/en/query-cache.html |
Sort buffer size | mysql.sort_buffer_size
|
The sort buffer size is dynamic and per-connection, so it should be changed per connection instead of by default. | https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html#sysvar_sort_buffer_size |
Swappiness | mysql.swappiness
|
Swap should be enabled with a low swappiness value (0 or 1) in order to avoid out-of-memory termination when low on memory. | https://www.kernel.org/doc/Documentation/sysctl/vm.txt |
MySQL upgrade | mysql.upgrade
|
mysql_upgrade should be run after a major version update of MySQL. |
https://dev.mysql.com/doc/refman/5.7/en/mysql-upgrade.html |
Relative buffer pool size | mysql.innodb.buffer_pool_memory_size
|
The configured buffer pool size should not be greater than 90% of total memory. | https://dev.mysql.com/doc/refman/5.7/en/innodb-parameters.html#sysvar_innodb_buffer_pool_size |
Buffer pool size | mysql.innodb.buffer_pool_size
|
The buffer pool size should be set according to the amount of memory available instead of the default of 128 MB. 60%-80% is a reasonable range. | https://dev.mysql.com/doc/refman/5.7/en/innodb-parameters.html#sysvar_innodb_buffer_pool_size |
Doublewrite buffer | mysql.innodb.doublewrite
|
The doublewrite buffer should be enabled to prevent torn page writes which can lead to data loss or corruption. | https://dev.mysql.com/doc/refman/5.7/en/innodb-doublewrite-buffer.html |
Flush method | mysql.innodb.flush_method
|
To maximize durability, innodb_flush_method should not be set to “littlesync” or “nosync.” |
https://dev.mysql.com/doc/refman/5.7/en/innodb-parameters.html#sysvar_innodb_flush_method |
Log flush on commit | mysql.innodb.flush_on_tx_commit
|
innodb_flush_log_at_trx_commit should be set to “1” to maximize ACID compliance. |
https://dev.mysql.com/doc/refman/5.7/en/innodb-parameters.html#sysvar_innodb_flush_log_at_trx_commit |
I/O capacity | mysql.innodb.io_capacity
|
The default value of innodb_io_capacity (200) may not be optimal for modern systems with SSDs. Consider increasing it to match the I/O capabilities of the disk. |
https://dev.mysql.com/doc/refman/5.7/en/innodb-parameters.html#sysvar_innodb_io_capacity |
Log output to file | mysql.log_output
|
log_output should be set to 'FILE' in order to write queries to a file as destination. |
|
Log Queries Without Indexes | mysql.log_queries_not_using_indexes
|
log_queries_not_using_indexes should be enabled (ON), otherwise queries that do not use indexes won't be logged to the slow log file. |
|
Log Short Format | mysql.log_short_format
|
log_short_format should be set to FALSE, otherwise the server will write less information to the slow log file. |
|
Log Slow Admin Statements | mysql.log_slow_admin_statements
|
log_slow_admin_statements should be enabled (ON), otherwise administrative statements won't be logged to the slow log file. |
|
Log Throttle Queries Without Indexes | mysql.log_throttle_queries_not_using_indexes
|
log_throttle_queries_not_using_indexes should be set to 0, otherwise the number of queries not using indexes will be limited to this value. |
|
Log UTC Timestamps | mysql.log_timestamps
|
log_timestamps should be set to 'UTC' (default value). |
|
Long Query Time | mysql.long_query_time_disabled
|
long_query_time should be set to 0 in order to log all the queries on the log file. |
|
Minimum Examined Row Limit for Slow log | mysql.min_examined_row_limit
|
min_examined_row_limit should be set to 0, otherwise not all the queries will be written to the slow log file. |
|
Off-host query digests | mysql.offhost_digests_disabled
|
Off-host query digests require the "statements_digest " consumer. |
|
Performance Schema | mysql.performance_schema_disabled
|
Disabling the Performance Schema will affect SolarWinds Observability's ability to monitor MySQL. | |
Performance Schema for Slow log | mysql.performance_schema_disabled_slow_log
|
Performance schema should be enabled when slow log is the capture method. This won't affect the ability to monitor but it's a good practice having it enabled as a few metrics are obtained from it. | |
Slow Query Log | mysql.slow_log_disabled
|
Reading queries from the slow query log requires this log to be enabled. Set the server's slow_query_log parameter to ON. |
|
Durable table definitions | mysql.sync_frm
|
sync_frm should be enabled to make sure table definitions are crash-safe. |
PostgreSQL advisor checks
PostgreSQL checks are based on the official PostgreSQL documentation, which makes a number of configuration recommendations. Visit the more information links in the table below to continue to the PostgreSQL documentation.
Check | Metric name | Description | More information |
---|---|---|---|
Statement logging | pgsql.security.log_statement
|
log_statement should be set to “none” because certain values will expose passwords when they are changed with ALTER ROLE , and can expose query text in some logging modes. |
https://www.postgresql.org/docs/current/static/runtime-config-logging.html#guc-log-statement |
Max connections | pgsql.config.max_connections
|
Connections are relatively expensive in PostgreSQL, so connection pooling is recommended to keep the maximum number of connections low. | https://wiki.postgresql.org/wiki/Number_Of_Database_Connections |
Autovacuum | pgsql.config.autovacuum
|
Autovacuum should be enabled to perform periodic maintenance automatically. | https://www.postgresql.org/docs/current/static/routine-vacuuming.html |
Synchronous commit | pgsql.config.synchronous_commit
|
Synchronous commit should be enabled to ensure transaction durability. | https://www.postgresql.org/docs/current/static/runtime-config-wal.html |
Fsync | pgsql.config.fsync
|
fsync should be enabled to ensure data integrity and avoid data corruption, especially after crashes or hard restarts. |
https://www.postgresql.org/docs/current/static/runtime-config-wal.html |
Memory consumption | pgsql.config.shared_buffers
|
PostgreSQL should be configured to use 25% to 40% of total memory for shared memory buffers. | https://wiki.postgresql.org/wiki/Tuning_Your_PostgreSQL_Server#shared_buffers |
Effective I/O concurrency | pgsql.config.effective_io_concurrency
|
I/O concurrency parameters should be set according to the capabilities of the database disk volume. | https://www.postgresql.org/docs/current/static/runtime-config-resource.html#runtime-config-resource-async-behavior |
Old snapshot threshold | pgsql.config.old_snapshot_threshold
|
old_snapshot_threshold should be enabled to avoid a gradual slowdown on production databases due to snapshot data bloat. |
https://www.postgresql.org/docs/current/static/runtime-config-resource.html |
I/O page cost | pgsql.config.page_cost
|
I/O page cost parameters should be set according to the capabilities of the database disk volume. | https://www.postgresql.org/docs/current/static/runtime-config-query.html#runtime-config-query-constants |
Work mem | pgsql.config.work_mem
|
work_mem should generally be changed only for specific sessions that need larger buffers. |
https://www.citusdata.com/blog/2018/06/12/configuring-work-mem-on-postgres/ |
Effective cache size | pgsql.config.effective_cache_size
|
effective_cache_size should be configured with a value between 50% and 75% of the total memory. If it is set too low indexes may not be used for executing queries. |
https://wiki.postgresql.org/wiki/Tuning_Your_PostgreSQL_Server#effective_cache_size |
WAL Buffers | pgsql.config.wal_buffers
|
wal_buffers should be set to 16MB (size of a single WAL segment) or even higher specially if you have a lot of concurrent write activity. |
https://wiki.postgresql.org/wiki/Tuning_Your_PostgreSQL_Server |
Maintenance work memory | pgsql.config.maintenance_work_mem
|
maintenance_work_mem should be set to at least 10% of total memory available. |
https://pydanny-event-notes.readthedocs.io/en/latest/DjangoConEurope2012/10-steps-to-better-postgresql-performance.html#maintenance-work-mem |
Idle transaction timeout | pgsql.config.idle_in_transaction_session_timeout
|
idle_in_transaction_session_timeout is 0 or disabled. Setting a timeout allows any locks held by a terminated session with an idle open transaction to be released, so that connection slot will be reused. |
https://www.postgresql.org/docs/current/runtime-config-client.html#GUC-IDLE-IN-TRANSACTION-SESSION-TIMEOUT |
Backend process limit | pgsql.backend.process_limit
|
max_connections should be less than the soft process limit set in the OS. |
https://www.postgresql.org/docs/current/static/runtime-config-connection.html |
Time since last vacuum | pgsql.vacuum.time_since_last_vacuum
|
Vacuums and/or autovacuums should be performed regularly to purge old data and avoid transaction ID wraparound, among other reasons. | https://www.postgresql.org/docs/current/static/routine-vacuuming.html |
Network exposure | pgsql.security.network_exposure
|
PostgreSQL should not be configured to listen on a publicly routable IP address to limit network exposure. | https://www.postgresql.org/docs/current/static/runtime-config-connection.html |
File system privileges | pgsql.security.fs_privileges
|
PostgreSQL configuration files and data directories should have proper permissions to prevent unauthorized access. | |
Outdated extensions | pgsql.extensions.versions
|
Extensions should not be older than the version of PostgreSQL. You should update extensions when upgrading PostgreSQL. | https://www.postgresql.org/docs/current/static/sql-alterextension.html |
Log Destination | pgsql.slow_var_log_destination
|
Server's "log_destination" parameter should be set to "stderr". | |
Slow Log Duration | pgsql.slow_var_log_duration
|
Server's "log_duration" parameter should be set to "on" to log the duration of statements. | |
Log Min Duration Statement | pgsql.slow_var_log_min_duration_statement
|
Server's "log_min_duration_statement" parameter should be set to "0" to log all statements. |