- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我的 Laravel 5.7 网站遇到了一些我认为彼此相关的问题(但发生在不同的时间):
PDO::prepare(): MySQL server has gone away
E_WARNING: Error while sending STMT_PREPARE packet. PID=10
PDOException: SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry
(我的数据库似乎经常尝试在同一秒内两次写入相同的记录。我一直无法弄清楚为什么或如何重现它;它似乎与用户行为无关。)max_allowed_packet=300M
(而不是 4M 的
default),但在我的网站有超过几个访问者的日子里,仍然经常遇到这些异常。
innodb_buffer_pool_chunk_size=218M
innodb_buffer_pool_size = 218M
artisan queue:work --sleep=3 --tries=3 --daemon
)。 mysqlslap
查询(虽然我完全是新手)并且即使在模拟数百个并发客户端时也没有发现任何缓慢的问题。 SHOW VARIABLES;
的结果和 SHOW GLOBAL STATUS;
are here . my.cnf
是:
[mysql]
[mysqld]
sql-mode="STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION"
character-set-server=utf8
innodb_buffer_pool_chunk_size=218M
innodb_buffer_pool_size = 218M
max_allowed_packet=300M
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow_query_log.log
long_query_time = 10
log_queries_not_using_indexes = 0
关于我应该探索什么来诊断和解决这些问题的任何想法?谢谢。
最佳答案
Re Slowlog:向我们展示你的 my.cnf。 [mysqld]
中的变化部分?通过 SELECT SLEEP(12);
进行测试,然后查看文件和表格。
查找查询的替代方法:由于查询需要几分钟,请执行 SHOW FULL PROCESSLIST;
当您认为它可能正在运行时。
你有多少内存?没有max_allowed_packet=300M
除非你有至少 30GB 的内存。否则你就有交换(甚至崩溃)的风险。将该设置保持在 RAM 的 1% 以下。
如需进一步分析可调参数,请提供 (1) RAM 大小,(2) SHOW VARIABLES;
和 (3) SHOW GLOBAL STATUS;
.
回复 deleted_at
:您提供的链接以“列已删除的_at 不是一个好的索引候选者”开头。你误解了它。说的是单列INDEX(deleted_at)
.我建议使用复合指数,例如 INDEX(contact_id, job_class_name, execute_at, deleted_at)
.
对小表进行简单查询需要 158 秒?可能还有很多其他事情正在发生。获取 PROCESSLIST
.
重新分离索引与复合索引:考虑两个索引:INDEX(last_name)
和 INDEX(first_name)
.你翻阅last_name索引找到“James”,那你能做什么?翻阅“Rick”的其他索引不会帮助您找到我。
变量和全局状态分析
观察:
( innodb_buffer_pool_size / _ram ) = 10M / 1024M = 0.98%
-- 用于 InnoDB buffer_pool 的 RAM 百分比
( innodb_buffer_pool_size ) = 10M
-- InnoDB 数据 + 索引缓存
( innodb_lru_scan_depth ) = 1,024
-- "InnoDB: page_cleaner: 1000ms 预期循环花费..."可以通过降低 lru_scan_depth 来修复
( Innodb_buffer_pool_pages_free / Innodb_buffer_pool_pages_total ) = 375 / 638 = 58.8%
-- 当前未使用的 buffer_pool 的百分比
( Innodb_buffer_pool_bytes_data / innodb_buffer_pool_size ) = 4M / 10M = 40.0%
-- 数据占用缓冲池的百分比
( innodb_log_buffer_size / _ram ) = 16M / 1024M = 1.6%
-- 用于缓冲 InnoDB 日志写入的 RAM 百分比。
( innodb_log_file_size * innodb_log_files_in_group / innodb_buffer_pool_size ) = 48M * 2 / 10M = 960.0%
-- 日志大小与 buffer_pool 大小的比率。建议使用 50%,但请参阅其他计算以了解它是否重要。
( innodb_flush_method ) = innodb_flush_method =
-- InnoDB 应该如何要求操作系统写入块。建议使用 O_DIRECT 或 O_ALL_DIRECT (Percona) 以避免双缓冲。 (至少对于 Unix。)请参阅 chrischandler 有关 O_ALL_DIRECT 的警告
( innodb_flush_neighbors ) = 1
-- 将块写入磁盘时的小优化。
( innodb_io_capacity ) = 200
- 每秒能够在磁盘上执行的 I/O 操作数。 100 用于慢速驱动器; 200 用于旋转驱动器; SSD 1000-2000;乘以 RAID 系数。
( innodb_print_all_deadlocks ) = innodb_print_all_deadlocks = OFF
-- 是否记录所有死锁。
( min( tmp_table_size, max_heap_table_size ) / _ram ) = min( 16M, 16M ) / 1024M = 1.6%
-- 当需要 MEMORY 表(每个表)或 SELECT 中的临时表(每个临时表每个 SELECT)时分配的 RAM 百分比。太高可能会导致交换。
( net_buffer_length / max_allowed_packet ) = 16,384 / 16M = 0.10%
( local_infile ) = local_infile = ON
-- local_infile = ON 是一个潜在的安全问题
( Select_scan / Com_select ) = 111,324 / 264144 = 42.1%
-- % 的选择进行全表扫描。 (可能会被存储的例程所迷惑。)
( long_query_time ) = 10
-- 定义“慢”查询的截止(秒)。
( Max_used_connections / max_connections ) = 152 / 151 = 100.7%
-- 峰值连接百分比
( Innodb_pages_read + Innodb_pages_written ) / Uptime = 0.186
Created_tmp_files = 0.015 /HR
Handler_write = 0.21 /sec
Innodb_buffer_pool_bytes_data = 3 /sec
Innodb_buffer_pool_pages_data = 256
Innodb_buffer_pool_pages_total = 638
Key_reads+Key_writes + Innodb_pages_read+Innodb_pages_written+Innodb_dblwr_writes+Innodb_buffer_pool_pages_flushed = 0.25 /sec
Table_locks_immediate = 2.8 /HR
Table_open_cache_hits = 0.44 /sec
innodb_buffer_pool_chunk_size = 5MB
Com_create_db = 0.41 /HR
Com_drop_db = 0.41 /HR
Connection_errors_peer_address = 2
Performance_schema_file_instances_lost = 9
Ssl_default_timeout = 500
ft_boolean_syntax = + -><()~*:&
have_ssl = YES
have_symlink = DISABLED
innodb_fast_shutdown = 1
optimizer_trace = enabled=off,one_line=off
optimizer_trace_features = greedy_search=on, range_optimizer=on, dynamic_range=on, repeated_subselect=on
session_track_system_variables = time_zone, autocommit, character_set_client, character_set_results, character_set_connection
slave_rows_search_algorithms = TABLE_SCAN,INDEX_SCAN
关于mysql - E_WARNING : Error while sending STMT_PREPARE packet. PID=*,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53469793/
我很难理解为什么这段代码无法编译: use std::cell::{Ref, RefCell}; struct St { data: RefCell } impl St { pub f
我从Richard Blum的一本书《 C#网络编程》中读到有关套接字的信息。以下摘录指出,不保证Send()方法可以发送所有传递给它的数据。 byte[] data = new byte[1024]
我有以下程序,它必须一次读取 1MB 的文件,将其发送到服务器(每次总是 1MB)并返回哈希码: #include #include #include #include #include #
代码在底部。 第 207 行的 send() 命令本身可以正常工作。但是,当我在第 218 行添加 send() 命令时,第一个命令失败 - 给出错误“地址错误”。我已经确认第二个 send() 命令
标记包含 !Send 的类型背后的原因是什么?字段(如 Rc 或 NonNull )与 Send特征?例如,标准库的 LinkedList 以这种方式工作:它包含 Option>字段并实现 Send特
我是新手,我正在尝试学习 goroutines 中信号函数的一些基本用法。我在 go 中有一个无限循环。通过这个 for 循环,我通过 channel 将值传递给 goroutine。 我也有一个阈值
如果数据是从另一台计算机(首先)“发送”的,我如何设置我的套接字例程以“发送”(首先)或(切换)“接收”? 谢谢 通用代码: -(void) TcpClient{ char buffer[12
这个问题已经有答案了: Java multiple file transfer over socket (3 个回答) 已关闭 4 年前。 我正在使用 Java Socket 将文件发送到服务器,然后
根据以下示例中的类型,Go编译器似乎将执行两个完全不同的语义操作: chanA <-chanB 如果chanA是类型(chan chan <-字符串),则此操作会将本身类型chanB的类型(chan
我正在尝试在 VBA 中使用 WinSock2 从本地主机 TCP 流发送(以及稍后接收)数据。 目前,我主要尝试从此处复制客户端示例,https://msdn.microsoft.com/en-us
我在我的 Mac OS X Yosemite 控制台中看到了这个: AppleEvents: Send port for process has no send right, port=( port:
我知道Clojure的“代理”是ref,带有“操作”的添加工作队列。 Action 是使用ref的值在第一个位置调用的函数,可以将其传递给其他参数。操作将返回ref的新值。因此,“代理”是一种计算re
我无法将任何对象或数组传递给 IPCRenderer。 通过 ipcs 传递对象或数组时出现错误,我什至尝试通过使用 JSON.stringify 转换为字符串来发送,但它会将其转换为空对象字符串。
我正在使用unix scoket进行数据传输(SOCK_STREAM模式) 我需要发送超过100k个字符的字符串。首先,我发送一个字符串的长度-它是sizeof(int)个字节。 length = s
Clojure API 将这两个函数描述为: (send a f & args) - Dispatch an action to an agent. Returns the agent immedia
def send_Button(): try: myMsg = "ME: " + text.get() msg = text.get() con
Ruby 对象都有一个“发送”方法,但是,我正在尝试使用一个 Java 库 ( netty-tools ),它的一个接口(interface)上有一个“发送”方法。 用法应该是 java_obj.se
Feb 8, 2011 11:56:49 AM com.sun.xml.internal.messaging.saaj.client.p2p.HttpSOAPC onnection post SEVE
来自 man 2 send: MSG_MORE (since Linux 2.4.4) (…) Since Linux 2.6, this flag is also supported for UDP
我的网页中可以有一个按钮,用于将预填充的消息发送到特定号码吗? 我正在尝试 intent://send/+391234567890#Intent;scheme=smsto;package=com.wh
我是一名优秀的程序员,十分优秀!