XenMobile® 작업 튜닝

Last published : Oct 21, 2026
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 유휴 테스트 기간

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
  • 설명: SQL에 대한 DB 연결

hibernate.c3p0.min\_size

이 사용자 지정 키는 XenMobile이 SQL Server 데이터베이스에 여는 최소 연결 수를 결정합니다. 키를 다음과 같이 구성하십시오. 기본값은 100입니다.
  • 키: hibernate.c3p0.min\_size
  • 값: 100
  • 표시 이름: hibernate.c3p0.min\_size
  • 설명: SQL에 대한 DB 연결

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 연결 풀 크기

APNs 연결 풀이 너무 작으면 100대 이상의 장치가 있을 때 APNs 활동 성능에 부정적인 영향을 미칠 수 있습니다. 성능 문제에는 장치에 앱 및 정책 배포 속도 저하, 장치 등록 속도 저하가 포함됩니다. 기본값은 1입니다. 약 400대 장치당 이 값을 1씩 늘리는 것이 좋습니다.

auth.ldap.connect.timeout

느린 LDAP 응답을 보완하기 위해 Citrix는 다음 Custom Key에 대한 서버 속성을 추가할 것을 권장합니다.
  • 키: 사용자 지정 키
  • 키: 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 읽기 시간 초과

기타 서버 최적화

서버 속성 기본 설정 이 설정을 변경하는 이유?
백그라운드 배포 1,440분 백그라운드 정책 배포 빈도(분). Android 장치의 상시 연결에만 적용됩니다. 정책 배포 빈도를 늘리면 서버 로드가 줄어듭니다. 권장 설정은 1440(24시간)입니다.
백그라운드 하드웨어 인벤토리 1,440분 백그라운드 하드웨어 인벤토리 빈도(분). Android 장치의 상시 연결에만 적용됩니다. 하드웨어 인벤토리 빈도를 늘리면 서버 로드가 줄어듭니다. 권장 설정은 1440(24시간)입니다.
삭제된 Active Directory 사용자 확인 간격 15분 Active Directory의 표준 동기화 시간은 15분입니다. 값 0은 XenMobile이 삭제된 Active Directory 사용자를 확인하는 것을 방지합니다. 권장 설정은 15분입니다.
MaxNumberOfWorker 3 많은 볼륨 구매 라이선스를 가져올 때 사용되는 스레드 수입니다. 기본값은 3입니다. 추가 최적화가 필요한 경우 스레드 수를 늘릴 수 있습니다. 그러나 6과 같이 스레드 수가 많으면 볼륨 구매 가져오기로 인해 CPU 사용량이 높아집니다.

SQL DB에서 교착 상태를 확인하고 기록 데이터를 삭제하는 방법

교착 상태가 발생하면 다음 쿼리를 실행하여 교착 상태를 확인합니다. 그런 다음 데이터베이스 관리자 또는 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

데이터베이스 정리

중요:
테이블을 변경하기 전에 데이터베이스를 백업하십시오.
  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;
  2. 이전 세 테이블에서 데이터를 삭제합니다.
    참고:
    테이블에 기록 데이터가 표시되지 않을 수 있습니다. 이 경우 해당 테이블에 대한 잘라내기 쿼리 실행을 건너뜀니다.
    truncate TABLE dbo.EWDEPLOY_HISTO;
    truncate TABLE dbo.EWSESS;
    truncate TABLE dbo.EWAUDIT;
  3. 교착 상태로 인해 차단된 SELECT 쿼리의 차단을 해제합니다. 이 단계는 추가 교착 상태를 처리합니다.
    ALTER DATABASE <database_name> SET       READ_COMMITTED_SNAPSHOT ON WITH ROLLBACK IMMEDIATE
  4. 기본적으로 데이터베이스 정리는 세션 보존 및 감사 보존 데이터를 유지하기 위해 7일로 설정되어 있으며, 이는 많은 사용자에게 높은 값입니다. 정리 값을 1일 또는 2일로 변경합니다. 서버 속성에서 다음 변경을 수행합니다.
    zdm.dbcleanup.sessionRetentionTimeInDays = 1 day
    zdm.dbcleanup.deployHistRetentionTimeInDays = 1 day
    zdm.dbcleanup.auditRetentionTimeInDays=1 day

KEYSTORE 테이블에서 고아 정리

XenMobile 노드의 성능이 저하되면 KEYSTORE 테이블이 너무 큰지 확인하십시오. XenMobile Server는 등록 인증서를 ENROLLMENT_CERTIFICATE 및 KEYSTORE 테이블에 저장합니다. 장치를 삭제하거나 다시 등록하면 ENROLLMENT_CERTIFICATE 테이블의 인증서가 삭제됩니다. KEYSTORE 테이블의 항목은 남아 있어 성능 문제를 일으킬 수 있습니다. 다음 절차를 수행하여 KEYSTORE 테이블에서 고아를 정리하십시오.
중요:
테이블을 변경하기 전에 데이터베이스를 백업하십시오.
  1. 다음 쿼리를 실행하여 기록 데이터를 확인합니다.
    select COUNT(*) from KEYSTORE
  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;
  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'
        );
  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");