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 / 问题

问题[session](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
leeand00
Asked: 2019-08-29 18:39:11 +0800 CST

iSeries/AS400 上的“会话”是什么?

  • 2

我在这里问了另一个问题,他们说我需要*REQUESTOR运行命令的会话。这个会话是什么,我如何找出它是什么?我知道有关网络服务器等的会话,但 AS400 是另一种动物,我不会假设他们正在谈论存储与您与系统的特定连接相关的变量的哈希图。

session
  • 1 个回答
  • 527 Views
Martin Hope
rickatech
Asked: 2016-09-15 11:37:00 +0800 CST

如何在 RHEL/CentOS 上的 redis 中创建 PHP 存储会话?

  • 0

通过 webtatic repo 进行一些运行 RHEL 7.2 和 PHP5.6 的开发和暂存 VM。

让 Apache w/PHP 和 Node.js 运行良好。让 redis 守护程序运行良好。

还没有找到让 PHP 在 redis 中存储会话的最佳实践。我看到对 phpredis 的引用,但看起来它需要从源代码构建?……预兆?...不是通过 yum 的 RPM?

  • php-nrk-Predis ?
  • php-pecl-redis ?
  • 或者只是编辑php.ini raw?
  • 以上的一些组合?

终极目标:让 Apache/PHP 和 Node.js 在同一个开发实例的 redis 中共享会话

php redis node.js session rhel7
  • 2 个回答
  • 1721 Views
Martin Hope
rlib
Asked: 2016-08-22 03:03:33 +0800 CST

Haproxy 的会话信息页面是什么意思?

  • 0

我正在使用 haproxy 1.6.8。

以下信息输出于

echo "show sess" | nc -U /var/lib/haproxy/stats 


0x1696d40: proto=tcpv4 src=67.55.94.187:51183 fe=adf be=adfback srv=capped ts=08 age=0s calls=4 rq[f=8400a0h,i=0,an=2000h,rx=,wx=,ax=] rp[f=400000h,i=0,an=60000h,rx=59s,wx=,ax=] s0=[7,8h,fd=186,ex=] s1=[7,108h,fd=209,ex=] exp=59s
0x17d4dd0: proto=tcpv4 src=173.239.36.124:19785 fe=adf be=adfback srv=capped2 ts=08 age=0s calls=4 rq[f=8400a0h,i=0,an=2000h,rx=,wx=,ax=] rp[f=400000h,i=0,an=60000h,rx=59s,wx=,ax=] s0=[7,8h,fd=100,ex=] s1=[7,108h,fd=246,ex=] exp=59s
0x16f7fc0: proto=tcpv4 src=67.55.94.183:54971 fe=adf be=adfback srv=capped ts=08 age=0s calls=4 rq[f=8400a0h,i=0,an=2000h,rx=,wx=,ax=] rp[f=400000h,i=0,an=60000h,rx=59s,wx=,ax=] s0=[7,8h,fd=168,ex=] s1=[7,108h,fd=288,ex=] exp=59s
0x1a8b170: proto=tcpv4 src=67.55.94.182:18194 fe=adf be=adfback srv=capped ts=08 age=0s calls=4 rq[f=8400a0h,i=0,an=2000h,rx=,wx=,ax=] rp[f=400000h,i=0,an=60000h,rx=59s,wx=,ax=] s0=[7,8h,fd=45,ex=] s1=[7,108h,fd=299,ex=] exp=59s

我该如何解释这些数据?有这方面的文档吗?

haproxy session stat
  • 1 个回答
  • 454 Views
Martin Hope
kinggs
Asked: 2016-04-18 04:37:17 +0800 CST

PHP会话目录已满?

  • 2

我希望有人能给我一些建议。我正在运行 CentOS 6 服务器,过去几天我的磁盘使用量从 60GB 变为 135GB(98% 已满)。我相信问题可能与 PHP 会话目录(/var/lib/php/session)有关,因为这似乎很大(我不能 ls 或 rm),这个目录中肯定有数百万个文件。

  1. 如何删除此目录?rm 在这里不起作用,我也尝试过 rsync 替换一个空目录,但这也需要永恒。

  2. 如果这是导致问题的原因 - 为什么 PHP 不会自动删除这些文件?

  3. 是否有任何日志记录可以将我指向漏洞利用、DDOS 或失败的方向?

谢谢

linux php session
  • 3 个回答
  • 10884 Views
Martin Hope
Martin
Asked: 2013-09-19 14:45:18 +0800 CST

在 Linux 内核中实现的 OSI 参考模型的“会话层”在哪里?

  • 1

OSI 7 层参考模型中的“会话层”负责创建、维护和关闭主机之间的会话。是否可以区分 Linux 网络堆栈中的“会话层”?使用的协议是什么?例如,如果使用 HTTP 下载一个 ASCII 文本文件,那么“会话层”是否会向传输层协议发出信号以创建连接?

session
  • 1 个回答
  • 1242 Views
Martin Hope
jdog
Asked: 2012-07-18 20:04:18 +0800 CST

PHP5 会话文件清理永远不会完成

  • 1

我的 Ubuntu 12.04 服务器带有这个 cron 作业,它必须用于清理 PHP 会话文件

find /var/lib/php5/ -depth -mindepth 1 -maxdepth 1 -type f -cmin +24 ! -execdir fuser -s {} ; -delete

在我的文件夹中,目前有大约 1110000 个这样的文件,服务器性能下降,因为清理过程从未完成。服务器在 Xen 平台上是虚拟的。

有没有更高效的方法可用?

ubuntu php apache-2.2 session
  • 1 个回答
  • 1146 Views
Martin Hope
stewert
Asked: 2012-06-12 06:46:20 +0800 CST

apache mod_proxy、页面重新加载和会话

  • 3

我使用 apache“mod_proxy”将所有请求转发到 glassfish 服务器。相关的 apache 配置是:

# proxy to glassfish app 
  ProxyRequests Off
  ProxyPreserveHost On

  <Proxy *>
    Order deny,allow
    Allow from all
  </Proxy>

  ProxyPass /myAppVaadin/VAADIN/ http://127.0.0.1:8080/myAppVaadin/VAADIN/
  ProxyPassReverse /myAppVaadin/VAADIN/ http://127.0.0.1:8080/myAppVaadin/VAADIN/
  ProxyPass /myAppVaadin/APP/ http://127.0.0.1:8080/myAppVaadin/APP/
  ProxyPassReverse /myAppVaadin/APP/ http://127.0.0.1:8080/myAppVaadin/APP/
  ProxyPass / http://127.0.0.1:8080/myAppVaadin/
  ProxyPassReverse / http://127.0.0.1:8080/myAppVaadin/

问题如下:

如果我在没有代理的情况下使用我的 Vaadin Web 应用程序,那么浏览器页面重新加载按钮会重新加载当前视图,而不会创建新会话。但是,如果我将 Web 应用程序与 apache 代理一起使用,页面重新加载按钮会创建一个新会话(我必须再次登录我的应用程序)。

任何人都知道如果我使用 apache 代理重新加载网页如何防止我获得新会话?

谢谢和问候,史蒂芬

PS:用mod_proxy_ajp我也是一样的效果

mod-proxy session
  • 1 个回答
  • 4808 Views
Martin Hope
Ronnie Jespersen
Asked: 2012-05-25 00:54:45 +0800 CST

共享会话文件存储上的 PHP 会话超时

  • 0

因此,首先我知道使用内存缓存或数据库是更好的方法。但是我(目前)已经创建了一个负载平衡环境,我在其中共享了一个 PHP 会话文件存储。一些客户现在声称他们遇到了一些问题,我不确定它是否与会话存储有关。

我的问题是 - PHP 如何处理共享的 php 会话文件存储?给他们的会话 ID 会有问题吗?(因为它的 3-4 个 Apache2/PHP 机器正在运行创建会话)当它们被标记为垃圾时如何清理?一台 apache2/PHP 机器可以“意外”删除一个不打算删除的会话吗?所有机器都有相同的“标记为垃圾”超时。他们都运行相同的 PHP 会话清理 cronjob。

/罗尼

ubuntu php apache-2.2 session
  • 1 个回答
  • 979 Views
Martin Hope
Shane
Asked: 2012-05-22 18:58:19 +0800 CST

在子域之间传递 PHP $_SESSION 中的变量

  • 1

最近我购买了一个 VDH 包,需要能够在子域与 $_SESSION 数组之间进行通信。这个系统是用这个想法构建的。我澄清说,购买前提供的 VDH 服务是可能的,但他们在访问情况方面没有提供太多帮助。

我做了很多研究并遵循了所有给出的建议,但无法让它发挥作用。我有一个基本的测试设置,其中一个页面将设置会话变量,另一个子域将输出会话。当前结果是会话数据丢失,但机器人测试页面上的会话 ID 相同。

所有域都在同一个框中。

测试文件一

    $session_name = session_name("er435536311993");
    session_set_cookie_params(0, '/', '.mysite.com.au');
    @session_start();
    $_SESSION['this_is_test'] = 'This was set in the sub domain';
    echo '<pre>';
    var_export($_SESSION);
    echo 'done';
    var_export(session_id());

测试文件二

    $session_name = session_name("374WEaPW2me1392ZQWLM");
    session_set_cookie_params(0, '/', '.whoadelaide.com.au');
    @session_start();
    echo '<pre>';
    var_export($_SESSION);
    var_export(session_id());

有些地方提到可能是权限错误。我已经访问了 httpd.conf 文件并将用户和组权限调整为相同,但仍然没有传递数据。

据我所知,所有域都在访问存储会话日期的同一 tmp 空间。

支持提到我应该禁用 suPHP 和 Eueexec 以使其工作。这并没有改变结果。

我无法在网上的任何地方找到我的问题的解决方案。我已经尝试了所有可能的解决方案,从 PHP 代码的变化到调整权限。

我已经尝试了一些人们提到的 shell 命令,但它们没有用。shell 中的 CMD 不是我熟悉的东西。我已经设置了 Putty,并且已经厌倦了一些事情。

有没有人有任何想法?有什么我可以尝试的吗?我的客户是

subdomain php session
  • 2 个回答
  • 3184 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