jjzjj

mysqltuner对my.cnf的建议和修改

coder 2023-06-11 原文

在Serverfault上遇到这个问题几天没有运气。

我已经在 VPS 上运行了 mysqltuner.pl,并且对于要更改的变量的建议有很多问题。我敢肯定,这些都是具有复杂答案的一般性问题。

我没有足够的知识来编写查询并在服务器上对其进行测试,但我只是想从运行五个 WordPress 网站的服务器中获得更高的性能,每月浏览量 >200,000 次。

我已经通过 phpmyadmin 优化了数据库(并且经常这样做),但是调谐器仍然说有碎片表。而且因为这是 WordPress,所以我无法更改核心代码中的查询。

但是我应该将 query_cache_size 和 innodb_buffer_pool_size 等变量增加多少?其他 innodb 变量呢?

建议的一些变量在 my.cnf 中不存在,例如 table_cache,并且在调谐器报告中被标记等。我可以将它们添加到 my.cnf 中吗?

(And why is this block duplicated in my.cnf? Can I delete the duplicate?)

set-variable = innodb_buffer_pool_size=2M
set-variable = innodb_additional_mem_pool_size=500K
set-variable = innodb_log_buffer_size=500K
set-variable = innodb_thread_concurrency=2

下面是my.cnf和mysqltuner的输出:

my.cnf 的内容:

query-cache-type = 1
query-cache-size = 8M

set-variable=local-infile=0
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql

old_passwords=1

skip-bdb

set-variable = innodb_buffer_pool_size=2M
set-variable = innodb_additional_mem_pool_size=500K
set-variable = innodb_log_buffer_size=500K
set-variable = innodb_thread_concurrency=2

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
skip-bdb

set-variable = innodb_buffer_pool_size=2M
set-variable = innodb_additional_mem_pool_size=500K
set-variable = innodb_log_buffer_size=500K
set-variable = innodb_thread_concurrency=2

mysqltuner 的输出:

------- General Statistics --------------------------------------------------
[--] Skipped version check for MySQLTuner script
[OK] Currently running supported MySQL version 5.0.45
[!!] Switch to 64-bit OS - MySQL cannot currently use all of your RAM

-------- Storage Engine Statistics -------------------------------------------
[--] Status: -Archive -BDB -Federated +InnoDB -ISAM -NDBCluster 
[--] Data in MyISAM tables: 133M (Tables: 637)
[--] Data in InnoDB tables: 10M (Tables: 344)
[--] Data in MEMORY tables: 126K (Tables: 2)
[!!] Total fragmented tables: 69

-------- Security Recommendations  -------------------------------------------
[OK] All database users have passwords assigned

-------- Performance Metrics -------------------------------------------------
[--] Up for: 1d 6h 24m 13s (2M q [22.135 qps], 116K conn, TX: 4B, RX: 530M)
[--] Reads / Writes: 97% / 3%
[--] Total buffers: 35.0M global + 2.7M per thread (100 max threads)
[OK] Maximum possible memory usage: 303.7M (8% of installed RAM)
[OK] Slow queries: 0% (4/2M)
[OK] Highest usage of available connections: 53% (53/100)
[OK] Key buffer size / total MyISAM indexes: 8.0M/46.1M
[OK] Key buffer hit rate: 99.6% (749M cached / 2M reads)
[OK] Query cache efficiency: 32.2% (685K cached / 2M selects)
[!!] Query cache prunes per day: 948863
[OK] Sorts requiring temporary tables: 0% (0 temp sorts / 660K sorts)
[!!] Temporary tables created on disk: 46% (400K on disk / 869K total)
[!!] Thread cache is disabled
[!!] Table cache hit rate: 0% (64 open / 24K opened)
[OK] Open file limit used: 10% (109/1K)
[OK] Table locks acquired immediately: 99% (2M immediate / 2M locks)
[!!] InnoDB data size / buffer pool: 10.6M/2.0M

-------- Recommendations -----------------------------------------------------
General recommendations:
    Run OPTIMIZE TABLE to defragment tables for better performance
    Enable the slow query log to troubleshoot bad queries
    When making adjustments, make tmp_table_size/max_heap_table_size equal
    Reduce your SELECT DISTINCT queries without LIMIT clauses
    Set thread_cache_size to 4 as a starting value
    Increase table_cache gradually to avoid file descriptor limits
Variables to adjust:
    query_cache_size (> 8M)
    tmp_table_size (> 32M)
    max_heap_table_size (> 16M)
    thread_cache_size (start at 4)
    table_cache (> 64)
    innodb_buffer_pool_size (>= 10M)

最佳答案

我会尽力提供帮助。 MysqlTuner 报告暗示您在此 VPS 中有 4GB RAM,因此我的建议基于此。

query_cache_size - 这是 MySQL 可用于缓存数据库查询结果的 RAM 量。存储在查询缓存中的结果返回速度比正常选择快得多,因此这个变量可以显着加快速度(比任何其他建议的更改都快)。

您需要做一些实验才能确定正确的值。您当前将此设置为 8M。如果你在这个盒子里有 4GB 的 RAM,我会从 64M 开始,如果需要的话增加到 128M 和 256M。每次更改后,放置几天,然后再次运行 MysqlTuner 并将“查询缓存效率”的百分比与之前的百分比进行比较。对于主要托管 5 个 Wordpress 博客的服务器,我怀疑您是否会看到超过 256M 的任何改进,并且我不建议超过总 RAM 的八分之一。

就我个人而言,我发现 Munin(一种免费的服务器监控工具)对于密切关注此类事情非常方便,因为它会绘制缓存命中率与其他查询的对比图。

tmp_table_size - 对于一些复杂的查询(特别是那些使用 GROUP BY 或复杂排序的查询),MySQL 需要首先创建一个包含数据的临时表,然后对其运行一些操作以创建结果集。它将尝试在内存中创建这些临时表,因为这比在磁盘上创建它们快得多;但对于大型结果集,这并不总是可能的。 tmp_table_size 控制这个阈值。

我无法想象 Wordpress 会执行任何非常复杂的查询,所以我不会过度使用这个查询。 MysqlTuner 建议值大于 32MB,因此从 64M 开始,几天后查看这对“在磁盘上创建的临时表”值有何影响。按照建议设置 max_heap_table_size。

thread_cache_size - 默认情况下 Wordpress 不使用持久连接(这很好),因此每个请求都会与您的数据库建立新连接,然后在页面生成后关闭它。这个开销并不大,但是使用 thread_cache_size 允许 MySQL 重用这些连接线程,这会有所帮助。

我会采用建议值 4,除非您获得大量并发用户,否则我认为这会很好。

table_cache - 这个有点看不懂,好像跟MySQL的表结构缓存有关。为此,我会选择 128。

innodb_buffer_pool_size - 这是 MySQL 可用于缓存 InnoDB 表的索引和数据的内存量。这让我有点困惑,因为我认为 Wordpress 根本不使用 InnoDB——你在这台服务器上还有其他网站吗?

为了回答您的其他问题,[mysqld_safe] 之后的配置仅适用于安全模式下的 MySQL 守护程序,而不适用于整个 MySQL,因此这就是某些变量重复的原因。如果你确实改变了 innodb_buffer_pool_size,你会想要改变第一个。您可以添加不在文件中的变量,是的,但是出于同样的原因将它们添加到 [mysqld_safe] block 之上。

最后,既然您想要优化,如果您还没有使用 PHP 字节码缓存,例如 APC那么这就值得探讨了。 APC 可以在没有任何负面影响的情况下显着提高 PHP 应用程序的速度。

关于mysqltuner对my.cnf的建议和修改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3753504/

有关mysqltuner对my.cnf的建议和修改的更多相关文章

  1. 安卓apk修改(Android反编译apk) - 2

    最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路

  2. ruby-on-rails - 一般建议和推荐的文件夹结构 - Sinatra - 2

    您将如何构建一个简单的Sinatra应用程序?我正在制作,我希望该应用具有以下功能:“应用程序”更像是一个包含所有信息的管理仪表板。然后另一个应用程序将通过REST访问信息。我还没有创建仪表板,只是从数据库中获取东西session和身份验证(尚未实现)您可以上传图片,其他应用可以显示这些图片我已经使用RSpec创建了一个测试文件通过Prawn生成报告目前的设置是这样的:app.rbtest_app.rb因为我实际上只有应用程序和测试文件。到目前为止,我已经将Datamapper用于ORM,将SQLite用于数据库。这是我的第一个Ruby/Sinatra项目,所以欢迎任何和所有建议-我应

  3. ruby-on-rails - Ruby on Rails - 我可以在调用之前修改属性的值吗? - 2

    假设我有一个名为Product的模型,其中有一个名为brand的字段。假设brand的值以this_is_a_brand格式存储。我可以在模型(或其他任何地方)中定义一个方法,允许我在调用brand之前修改它的值吗?例如,如果我调用@product.brand,我想得到ThisisaBrand,而不是this_is_a_brand。 最佳答案 我建议使用方括号语法([]和[]=)而不是read_attribute和write_attribute。方括号语法更短并且designedtowraptheprotectedread/writ

  4. ruby-on-rails - my_object.save(false) 并没有真正跳过我的 Active Record 验证 - 2

    所以我一直在努力解决我一直遇到的这个错误,我终于找到了导致它的原因。我一直觉得,当我调用@my_model.save(false)我会跳过我的ActiveRecord验证。事实证明这是部分正确的。我的对象正在保存到数据库中DESPITE我的ActiveRecord验证。我的问题存在是因为我的一个验证在验证过程中修改了一个子模型(这是一个24小时位置的调度应用程序,因此当午餐被保存时,我对照他们保存的那天和第二天检查它们以及确保用户不是指“凌晨2点”表示要上夜类。我的问题是:有没有办法真正跳过我的验证并直接移动到数据库?这是正常的ActiveRecord行为还是我应该更深入地研究我的验证

  5. ruby - 无论如何要在 REPL 中重新加载修改后的 gem 文件 - 2

    在尝试构建Rubygem(使用Bundler)时,我倾向于使用Bundler提供的REPL测试代码——可通过bundleconsole访问。有什么方法可以重新加载整个项目吗?我最终再次加载单个(更改的)文件以测试新更改。 最佳答案 以下hack适用于我的一个相对简单的gem和Ruby2.2.2。我很想看看它是否适合你。它做出以下假设:您具有传统的文件夹结构:一个名为lib/my_gem_name.rb的文件和一个文件夹lib/my_gem_name/,其中包含任何文件/文件夹结构。您要重新加载的所有类都嵌套在您的顶级模块MyGemN

  6. Centos7-yum安装mysql-修改密码-无密码登录-安全配置 - 2

    目录1、yum安装mysql修改密码(1)在mysql里面修改(2)第二种方式,利用mysqladmin修改密码2、没有密码,登录mysql修改密码3、mysql的安全设置1、yum安装mysql在CentOS中默认安装有MariaDB(MySQL的一个分支),安装完成之后可以直接覆盖MariaDB。rpm-qa|grepmariadb查询是否安装了mariadbrpm-e--nodepsmariadb-libs-5.5.60-1.el7_5.x86_64卸载mariadwgethttp://dev.mysql.com/get/mysql57-community-release-el7-11.

  7. ruby-on-rails - 如何仅修改内存中的 zip 文件? - 2

    我有一个Ruby应用程序,我需要修改现有的zip文件。我想在内存中构建zip文件并流回字节,而无需将文件写入文件系统。如果我最终在Heroku上托管它,我认为我无法写入文件系统。有谁知道这样做的方法吗?我看了Zip::ZipFile但看起来它总是想写入文件系统。我想“基于java实现”我将能够只获取压缩文件的字节,这可以在java中完成,但我看不到这样做的方法。编辑:我要问的与此基本相同,但针对Ruby而不是Python:Functiontocreatein-memoryzipfileandreturnashttpresponse 最佳答案

  8. ruby-on-rails - 检查模型是否在 before_save 事件中被修改或创建 - 2

    我想检查是否正在Rails的before_save回调中创建模型。我还想检查它是否已被修改(更新时)。谢谢 最佳答案 您可以使用new_record?看看你是否有一个全新的对象和changed?查看是否有任何变化:before_save:pancakesdefpancakesifnew_record?#Notinthedatabaseyet.elsifchanged?#Alreadyexistsbutithasunsavedchanges.endend 关于ruby-on-rails-检

  9. ruby-on-rails - 递归修改嵌套哈希中的值 - 2

    鉴于以下哈希结构,我想遍历该结构并使用“链接”键对所有值进行修改:{"page_id":"12345","link_data":{"message":"testmessage","link":"https://www.example.com","caption":"https://www.example.com","child_attachments":[{"link":"http://www.example.com","name":"test","description":"test","picture":"https://fbcdn-creative-a.akamaihd.net/

  10. ruby - 我可以获得修改 HTTP 文件的日期吗? - 2

    我正在尝试检查自上次检查以来是否修改了文件(在网络上)。是否可以通过获取httpheader来读取文件上次修改(或上传)的时间来做到这一点? 最佳答案 您可以使用内置的Net::HTTP库为您完成大部分工作:require'net/http'Net::HTTP.start('stackoverflow.com')do|http|response=http.request_head('/robots.txt')response['Last-Modified']#=>Sat,04Jun201108:51:44GMTend如果需要,您可以

随机推荐