AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题

问题[deadlock](server)

Martin Hope
rjbathgate
Asked: 2020-11-03 16:24:02 +0800 CST

Codeignitor - 在登录/会话负载下 MySQL CPU 峰值和致命的 MySQL 死锁

  • 1

最初发布在stackoverflow上,并被推荐 serverfault 可能是更好的地方。

我有一个网站使用:

  • AWS RDS (MySQL Aurora) - 单个 t3.medium 实例
  • 负载均衡器上的 4 个 EC2(固定实例非弹性)
  • CodeIgnitor 3 代码库(3.1.11)(我刚刚根据推荐从 3.1.7 升级,因为新版本中有一些 Session 改进)。

一些规格:

EC2:

PHP Version 7.2.32-1+ubuntu18.04.1+deb.sury.org+1
Linux ip-172-32-19-104 5.4.0-1028-aws #29~18.04.1-Ubuntu SMP Tue Oct 6 17:14:23 UTC 2020 x86_64
Apache/2.4.29 (Ubuntu)

RDS:

5.6.mysql_aurora.1.22.2
Instance class: db.t3.medium
vCPU: 2
RAM: 4 GB

在繁重的负载下(500 人尝试在十分钟内登录),我们会遇到间歇性但重大的问题。很难获得有关用户体验的确切信息,但事情表明:

  • RDS MySQL Aurora CPU 显着飙升 (100%)
  • RDS MySQL Aurora Connections 峰值 (30-45) - 根据我的阅读,RDS Max Connections 是 {DBInstanceClassMemory/12582880},所以大约 340 4GB(1024 4 1024*1024)/12582880
  • 产生的错误Deadlock found when trying to get lock; try restarting transaction- 请参阅下面的完整错误跟踪。

因此,我做出了一个可能不正确的假设:

  1. 增加负载 >> 增加 RDS CPU 使用率
  2. 高 RDS CPU >> 死锁 >> 致命的 MySQL 错误(我对死锁不太熟悉,不知道这是否会发生,但听起来可行)。

错误指向libaries\Session\drivers\Session_database_driver.php,具体来说:

     /**
     * Write
     *
     * Writes (create / update) session data
     *
     * @param   string  $session_id Session ID
     * @param   string  $session_data   Serialized session data
     * @return  bool
     */
    public function write($session_id, $session_data)

   ...
   ...
   ...
   if ($this->_db->update($this->_config['save_path'], $update_data))
        {
            $this->_fingerprint = md5($session_data);
            return $this->_success;
        }

因此,我们在尝试更新 CI 会话时遇到了数据库死锁。

它似乎总是在用户登录过程中抛出错误,我认为这是更新会话繁重。

此会话和数据库类符合 CI 3.1.7 代码库。

当前的 Code Ignitor Session 配置如下:

$config['sess_driver'] = 'database';
$config['sess_cookie_name'] = 'ci_session';
$config['sess_expiration'] = 7200;
$config['sess_save_path'] = 'ci_sessions';
$config['sess_match_ip'] = FALSE;
$config['sess_time_to_update'] = 300;
$config['sess_regenerate_destroy'] = FALSE;

所以,如果我的假设是正确的,那么最好的行动计划是什么:

  1. 迁移到 RDS Serverless 并让 RDS 扩展以处理 CPU 负载?(我在某处读到 Serverless 可能无法很好地处理锁,因为它在锁定时无法正确扩展......我对此的理解显然是有限的)
  2. 迁移到更大的固定(非无服务器)RDS 来处理 CPU 负载?(不理想,因为 95% 的时间网站没有流量)
  3. 修改会话以存储在文件而不是数据库中- 这对我来说听起来很合乎逻辑,因为我们将所有会话负载从 MySQL 中移除,但我不完全了解任何其他后果,也不是只是修改$config['sess_driver']和设置会话文件文件夹路径
  4. 别的东西......(php-fpm?)

对于选项 3),我们使用负载均衡器,所以我担心如果用户在中途切换 LB,基于文件的会话将意味着用户会话的丢失。虽然,这可能是一个可以管理的问题,因为用户将在他们逗留期间留在 LB 上,除非它在中途跌倒。

选项 1 和 2 似乎是一种创可贴的方法,而不是解决无效的问题,但是,这可能只是资源不足的情况。

我在其他地方读到了一篇关于使用 php-fpm 减少同时 apache 线程数量的类似帖子的建议,但不确定这是否与此处相关,特别是在 php 7.2 上给出

很难“测试”,因为它只发生在大量用户登录负载下,所以一些建议将不胜感激,所以我不必在黑暗中多次刺伤。

谢谢

编辑:

以下完整错误的副本:

A Database Error Occurred 

Error Number: 1213 

Deadlock found when trying to get lock; try restarting transaction 

UPDATE `ci_sessions` SET `timestamp` = 1604298368 WHERE `id` = 'fqi83a50dfknbvl9h2r98mtgn2f3j2j6' Filename: libraries/Session/drivers/Session_database_driver.php 

Line Number: 260 

A PHP Error was encountered 

Severity: Warning 

Message: Unknown: Cannot call session save handler in a recursive manner 

Filename: Unknown 

Line Number: 0 
Backtrace: 

A PHP Error was encountered 

Severity: Warning 

Message: Unknown: Failed to write session data using user defined save handler. (session.save_path: /var/lib/php/sessions) 

Filename: Unknown 

Line Number: 0 

Backtrace

编辑: SHOW CREATE TABLE ci_sessions;

'ci_sessions', 'CREATE TABLE `ci_sessions` (
 `id` varchar(128) NOT NULL,
 `ip_address` varchar(45) NOT NULL,
 `timestamp` int(10) unsigned NOT NULL DEFAULT \'0\',
 `data` blob NOT NULL,
  KEY `ci_sessions_timestamp` (`timestamp`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8'
mysql session amazon-rds deadlock
  • 1 个回答
  • 413 Views
Martin Hope
Frabac
Asked: 2020-06-25 07:06:55 +0800 CST

识别 WebSphere 中的线程死锁

  • 0

在 WebSphere 8.5.5.13 中,我遇到了一些内存不足错误,并且数据库连接已达到极限。在我看来,这是由于线程饥饿(我有一些进程试图以 10 秒的超时时间做某事,而其他任务通常需要约 200 毫秒,但实际上需要约 10200 毫秒)。但我认为最后一个甚至可能是一个僵局。我有大约 100 个线程像这样等待

3XMTHREADINFO      "WorkManager.DefaultWorkManager : 648" J9VMThread:0x000000000F2AA300, omrthread_t:0x00007FE38D060D78, java/lang/Thread:0x000000018ACD99E8, state:B, prio=5
3XMJAVALTHREAD            (java/lang/Thread getId:0x68C86, isDaemon:true)
3XMTHREADINFO1            (native thread ID:0xF8DE, native priority:0x5, native policy:UNKNOWN, vmstate:B, vm thread flags:0x00000201)
3XMTHREADINFO2            (native stack address range from:0x00007FE09C92F000, to:0x00007FE09C96F000, size:0x40000)
3XMCPUTIME               CPU usage total: 2.131995383 secs, current category="Application"
3XMTHREADBLOCK     Blocked on: com/ibm/ws/util/ThreadPool@0x000000011CD4B888 Owned by: "WorkManager.DefaultWorkManager : 689" (J9VMThread:0x00000000011B3000, java/lang/Thread:0x00000001B148B9A8)
3XMHEAPALLOC             Heap bytes allocated since last GC cycle=0 (0x0)
3XMTHREADINFO3           Java callstack:
4XESTACKTRACE                at com/ibm/ws/util/ThreadPool.getTask(ThreadPool.java:1083(Compiled Code))
4XESTACKTRACE                at com/ibm/ws/util/ThreadPool$Worker.run(ThreadPool.java:1916(Compiled Code))

WorkManager.DefaultWorkManager : 689 的堆栈看起来像这样

3XMTHREADINFO      "WorkManager.DefaultWorkManager : 689" J9VMThread:0x00000000011B3000, omrthread_t:0x00007FE1A41A70D0, java/lang/Thread:0x00000001B148B9A8, state:R, prio=5
3XMJAVALTHREAD            (java/lang/Thread getId:0x68CCD, isDaemon:true)
3XMTHREADINFO1            (native thread ID:0x11410, native priority:0x5, native policy:UNKNOWN, vmstate:CW, vm thread flags:0x00001001)
3XMTHREADINFO2            (native stack address range from:0x00007FE1EFF3E000, to:0x00007FE1EFF7E000, size:0x40000)
3XMCPUTIME               CPU usage total: 1.663139688 secs, current category="Application"
3XMHEAPALLOC             Heap bytes allocated since last GC cycle=0 (0x0)
3XMTHREADINFO3           Java callstack:
4XESTACKTRACE                at java/lang/ThreadLocal$ThreadLocalMap.set(ThreadLocal.java:502(Compiled Code))
4XESTACKTRACE                at java/lang/ThreadLocal$ThreadLocalMap.access$100(ThreadLocal.java:311(Compiled Code))
4XESTACKTRACE                at java/lang/ThreadLocal.setInitialValue(ThreadLocal.java:197(Compiled Code))
4XESTACKTRACE                at java/lang/ThreadLocal.get(ThreadLocal.java:183(Compiled Code))
4XESTACKTRACE                at com/ibm/ws/util/objectpool/TwoTierObjectPool.purgeThreadLocal(TwoTierObjectPool.java:264(Compiled Code))
4XESTACKTRACE                at com/ibm/ws/buffermgmt/impl/WsByteBufferPool.purgeThreadLocal(WsByteBufferPool.java:173(Compiled Code))
4XESTACKTRACE                at com/ibm/ws/buffermgmt/impl/WsByteBufferPoolManagerImpl.purgeThreadLocals(WsByteBufferPoolManagerImpl.java:1169(Compiled Code))
4XESTACKTRACE                at com/ibm/ws/runtime/component/WSBBPoolListener.threadDestroyed(WSBBPoolListener.java:62(Compiled Code))
4XESTACKTRACE                at com/ibm/ws/runtime/component/ThreadPoolMgrImpl.threadDestroyed(ThreadPoolMgrImpl.java:459(Compiled Code))
4XESTACKTRACE                at com/ibm/ws/util/ThreadPool.fireThreadDestroyed(ThreadPool.java:1593(Compiled Code))
4XESTACKTRACE                at com/ibm/ws/util/ThreadPool.workerDone(ThreadPool.java:1005(Compiled Code))
5XESTACKTRACE                   (entered lock: com/ibm/ws/util/ThreadPool@0x000000011CD4B888, entry count: 1)
4XESTACKTRACE                at com/ibm/ws/util/ThreadPool$Worker.run(ThreadPool.java:1929(Compiled Code))

作为参考,空闲的线程(并且不等待释放某些东西)看起来像这样

  at sun/misc/Unsafe.park(Native Method)
  at java/util/concurrent/locks/LockSupport.parkNanos(LockSupport.java:222)
  at java/util/concurrent/locks/AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2127)
  at com/ibm/ws/util/BoundedBuffer$GetQueueLock.await(BoundedBuffer.java:285)
  at com/ibm/ws/util/BoundedBuffer.waitGet_(BoundedBuffer.java:424)
  at com/ibm/ws/util/BoundedBuffer.take(BoundedBuffer.java:817)
  at com/ibm/ws/util/ThreadPool.getTask(ThreadPool.java:934)
  at com/ibm/ws/util/ThreadPool$Worker.run(ThreadPool.java:1704)

或者

  at java/lang/Object.wait(Native Method)
  at java/lang/Object.wait(Object.java:231)
  at com/ibm/ws/util/BoundedBuffer.waitGet_(BoundedBuffer.java:192)
  at com/ibm/ws/util/BoundedBuffer.take(BoundedBuffer.java:543)
  at com/ibm/ws/util/ThreadPool.getTask(ThreadPool.java:819)
  at com/ibm/ws/util/ThreadPool$Worker.run(ThreadPool.java:1544)

我的一个都不像那些。

谢谢!

threads deadlock websphere
  • 1 个回答
  • 601 Views
Martin Hope
squillman
Asked: 2009-06-30 13:39:44 +0800 CST

何时更改 64 位服务器上的 SQL 2005 最大工作线程数

  • 1

服务器环境:

  • Windows 2003 标准 R2 x64 SP2
  • SQL 2005 企业版 64 位 SP2
  • HP ProLiant BL460c G1、Xeon E5440 2.83 Ghz 处理器(四核)
  • 8 GB 内存

编辑:我还应该注意 max_workers_count 当前为 4 处理器盒的默认值 512

我们遇到了线程池死锁,我很确定这与并行性有关。死锁图与 Bart Duncan 关于Intra-Query Parallel Thread Deadlocks的帖子中的几乎相同,我没有看到死锁输出中提到锁资源,正如他帖子的警告部分中提到的那样相信这是一个并行的事情。

我正在调整看起来与这些相关的查询,但这需要一点时间(阅读“几周”)。同时,我想知道作为临时解决方法,增加线程池是否明智。

那里有任何 SQL Jocks 想帮助一个人吗?

(顺便说一句 - 由于这个问题,现在不能选择 SP3 )

sql-server sql-server-2005 deadlock threadpool
  • 2 个回答
  • 2340 Views

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve