XenMobile Server 当前版本

调整 XenMobile 操作

XenMobile 操作的性能和稳定性涉及 XenMobile 中的多个设置,并取决于您的 Citrix ADC 和 SQL Server 数据库配置。本文重点介绍管理员最常配置且与 XenMobile 的调整和优化相关的设置。Citrix 建议在部署 XenMobile 之前评估本文中的每个设置。

重要提示:

这些指导原则假定 XenMobile Server 的 CPU 和 RAM 足以满足相应设备数的需要。有关可扩展性的详细信息,请参阅可扩展性和性能

以下服务器属性全局应用于整个 XenMobile 实例中的操作、用户和设备。更改某些服务器属性后需要重新启动每个 XenMobile Server 节点。需要重新启动时,XenMobile 会向您发出通知。

这些调整指导原则适用于群集环境和非群集环境。

hibernate.c3p0.idle_test_period

此 XenMobile Server 属性(即“自定义键”)确定自动验证连接之前的空闲时间(秒)。按如下所示配置键。默认值为 30

  • 键:自定义键
  • 键:hibernate.c3p0. idle_test_period
  • 值:120
  • 显示名称:hibernate.c3p0. idle_test_period
  • 说明:休眠空闲测试时间段

hibernate.c3p0.max_size

此自定义键确定 XenMobile 可以打开的与 SQL Server 数据库的最大连接数。XenMobile 使用您为此自定义键指定的值作为上限。仅当需要连接时才会打开连接。设置基于数据库服务器的容量。

请注意群集配置中的以下公式。c3p0 连接乘以节点数等于 XenMobile 可以向 SQL Server 数据库打开的实际最大连接数。

在群集配置和非群集配置中,如果对太小的 SQL Server 设置的值过高,会导致在峰值负载期间 SQL 端出现资源问题。设置的值过低意味着可能无法利用可用的 SQL 资源。

按如下所示配置键。默认值为 1000

  • 键:hibernate.c3p0.max_size
  • 值:1000
  • 显示名称:hibernate.c3p0.max_size
  • 说明:DB 与 SQL 的连接数

hibernate.c3p0.min_size

此自定义键确定 XenMobile 打开的与 SQL Server 数据库的最小连接数。按如下所示配置键。默认值为 100

  • 键:hibernate.c3p0.min_size
  • 值:100
  • 显示名称:hibernate.c3p0.min_size
  • 说明:DB 与 SQL 的连接数

hibernate.c3p0.timeout

此自定义键确定空闲超时。如果您使用数据库群集故障转移,Citrix 建议您添加此自定义键并对其进行设置以缩短空闲超时。默认值为 120

  • 键:自定义键
  • 键:hibernate.c3p0.timeout
  • 值:120
  • 显示名称:hibernate.c3p0.timeout
  • 说明:数据库空闲超时

推送服务检测信号时间间隔

此设置决定 iOS 设备检查在相应期间是否未传送 APNs 通知的频率。提高 APNs 检测信号频率可以优化数据库通信。值过大可能会导致增加不必要的负载。此设置仅适用于 iOS。默认值为 20 小时

如果您的环境中有大量 iOS 设备,检测信号时间间隔可能会导致实际负载高于所需负载。选择性擦除、锁定和完全擦除等安全操作不依赖此检测信号。原因是在执行这些操作时系统会向设备发送 APNs 通知。

此值管理在 Active Directory 组成员身份发生变化后策略更新的速度。因此,通常适合将此值增加到 12 到 20 小时之间的数以降低负载。

iOS MDM APNs 连接池大小

当您有 100 多台设备时,APNs 连接池太小可能会对 APNs 活动性能产生负面影响。性能问题包括降低向设备部署应用程序和策略的速度以及设备注册速度。默认值为 1。我们建议您为大约每 400 个设备将此值增加 1。

auth.ldap.connect.timeout

为了补偿 LDAP 响应慢的情况,Citrix 建议为以下自定义键添加服务器属性。

  • 键:自定义键
  • 键:auth.ldap.connect.timeout
  • 值:60000
  • 显示名称:auth.ldap.connect.timeout
  • 说明:LDAP 连接超时

auth.ldap.read.timeout

为了补偿 LDAP 响应慢的情况,Citrix 建议为以下自定义键添加服务器属性。

  • 键:自定义键
  • 键:auth.ldap.read.timeout
  • 值:60000
  • 显示名称:auth.ldap.read.timeout
  • 说明:LDAP 读取超时

其他服务器优化

     
服务器属性 默认设置 为什么更改此设置?
后台部署 1440 分钟 后台策略部署的频率(分钟)。仅适用于 Android 设备的始终启用连接。提高策略部署的频率可降低服务器负载。建议的设置为 1440(24 小时)。
后台硬件清单 1440 分钟 后台硬件清单的频率(分钟)。仅适用于 Android 设备的始终启用连接。提高硬件清单的频率可降低服务器负载。建议的设置为 1440(24 小时)。
检查删除的 Active Directory 用户的时间间隔 15 分钟 Active Directory 的标准同步时间为 15 分钟。值为 0 将阻止 XenMobile 检查删除的 Active Directory 用户。建议的设置为 15 分钟。
MaxNumberOfWorker 3 导入许多批量购买许可证时使用的线程数量。默认值为 3。如果需要进一步优化,可以增加线程的数量。但是,如果使用数量较大的线程,例如 6 个,批量购买导入会导致 CPU 使用率非常高。

如何查看 SQL 数据库中的死锁和删除历史数据

当您看到死锁时,请运行以下查询以查看死锁。然后,数据库管理员或 Microsoft SQL 团队可以确认该信息。

SQL 查询

SELECT

db.name DB_Service,

tl.request_session_id,

wt.blocking_session_id,

OBJECT_NAME(p.OBJECT_ID) BlockedObjectName,

tl.resource_type,

h1.TEXT AS RequestingText,

h2.TEXT AS BlockingTest,

tl.request_mode

FROM sys.dm_tran_locks AS tl

INNER JOIN sys.databases db ON db.database_id = tl.resource_database_id

INNER JOIN sys.dm_os_waiting_tasks AS wt ON tl.lock_owner_address = wt.resource_address

INNER JOIN sys.partitions AS p ON p.hobt_id = tl.resource_associated_entity_id

INNER JOIN sys.dm_exec_connections ec1 ON ec1.session_id = tl.request_session_id

INNER JOIN sys.dm_exec_connections ec2 ON ec2.session_id = wt.blocking_session_id

CROSS APPLY sys.dm_exec_sql_text(ec1.most_recent_sql_handle) AS h1

CROSS APPLY sys.dm_exec_sql_text(ec2.most_recent_sql_handle) AS h2

GO
<!--NeedCopy-->

清理数据库

重要提示:

请先备份您的数据库,然后再对表格进行更改。

  1. 请运行以下查询以查看历史数据。

    select COUNT(*) as total_record from dbo.EWDEPLOY_HISTO;
    select COUNT(*) as total_record from dbo.EWSESS;
    select COUNT(*) as total_record from dbo.EWAUDIT;
    <!--NeedCopy-->
    
  2. 删除上述三个表中的数据。

    注意:

    您可能看不到表中的历史数据。如果需要,请跳过为该特定表运行截断查询。

    truncate TABLE dbo.EWDEPLOY_HISTO;
    truncate TABLE dbo.EWSESS;
    truncate TABLE dbo.EWAUDIT;
    <!--NeedCopy-->
    
  3. 解锁因死锁而被阻止的 SELECT 查询。此步骤可处理更多死锁。

    ALTER DATABASE <database_name> SET       READ_COMMITTED_SNAPSHOT ON WITH ROLLBACK IMMEDIATE
    <!--NeedCopy-->
    
  4. 默认情况下,对于保留会话保留和审核保留数据的数据库,数据库清理为七天一次,该时间对于许多用户而言较长。请将清理值更改为 1 天或 2 天。在服务器属性中,进行以下更改:

    zdm.dbcleanup.sessionRetentionTimeInDays = 1 day
    zdm.dbcleanup.deployHistRetentionTimeInDays = 1 day
    zdm.dbcleanup.auditRetentionTimeInDays=1 day
    <!--NeedCopy-->
    

清理 KEYSTORE 表中的孤立项

如果 XenMobile 节点性能较差,请检查 KEYSTORE 表是否太大。XenMobile Server 将注册证书存储在 ENROLLMENT_CERTIFICATE 和 KEYSTORE 表中。当您删除或重新注册设备时,ENROLLMENT_CERTIFICATE 中的证书将被删除。KEYSTORE 表中的条目仍然存在,这可能会导致性能问题。请执行以下过程以清除 KEYSTORE 表中的孤立项。

重要提示:

请先备份您的数据库,然后再对表格进行更改。

  1. 请运行以下查询以查看历史数据。

    select COUNT(*) from KEYSTORE
    <!--NeedCopy-->
    
  2. 使用以下查询检查 KEYSTORE 表中的孤立项。

    WITH cte(KEYSTORE_ID)
    AS (SELECT KEYSTORE_ID
        FROM ENROLLMENT_CERTIFICATE
        UNION
        SELECT CA_KEYSTORE_ID
        FROM LDAP_CONFIG
        UNION
        SELECT CLIENT_KEYSTORE_ID
        FROM LDAP_CONFIG
        UNION
        SELECT KEYSTORE_ID
        FROM SAML_SERVICE_PROVIDER
        UNION
        SELECT KEYSTORE_ID
        FROM SERVER_CERTIFICATE)
    SELECT keystore.id
    FROM keystore
        LEFT JOIN cte ON keystore.id = cte.KEYSTORE_ID
    WHERE KEYSTORE_ID IS NULL;
    <!--NeedCopy-->
    
  3. 使用以下查询清除孤立项。

    WITH cte(KEYSTORE_ID)
        AS (SELECT KEYSTORE_ID
            FROM ENROLLMENT_CERTIFICATE
            UNION
            SELECT CA_KEYSTORE_ID
            FROM LDAP_CONFIG
            UNION
            SELECT CLIENT_KEYSTORE_ID
            FROM LDAP_CONFIG
            UNION
            SELECT KEYSTORE_ID
            FROM SAML_SERVICE_PROVIDER
            UNION
            SELECT KEYSTORE_ID
            FROM SERVER_CERTIFICATE)
        DELETE FROM keystore
        WHERE id IN
        (
            SELECT keystore.id
            FROM keystore
                LEFT JOIN cte ON keystore.id = cte.KEYSTORE_ID
            WHERE KEYSTORE_ID IS NULL AND keystore.TYPE = 'X_509'
        );
    <!--NeedCopy-->
    
  4. 向 KEYSTORE 表中添加索引以提高搜索效率。

    DROP INDEX "KEYSTORE_NAME_IDX" ON "KEYSTORE";
    ALTER TABLE "KEYSTORE" ALTER COLUMN "NAME" NVARCHAR(255) NULL;
    CREATE INDEX "KEYSTORE_NAME_IDX" ON "KEYSTORE"("NAME") INCLUDE ("ID", "TYPE", "CONTENT", "PASSWORD", "PUBLICLY_TRUSTED", "DESCRIPTION", "ALIAS", "MODIFICATION_DATE");
    <!--NeedCopy-->