Jasypt - низкая производительность на Solaris - PullRequest
0 голосов
/ 15 февраля 2019

Я использую PooledPBEStringEncryptor для расшифровки некоторых строк.Я запускаю тест на нескольких потоках.

Я выполняю описанный ниже метод на нескольких потоках

public static long decryptJasypt (String str)
{
  long time = System.currentTimeMillis();
  encryptor.decrypt(str);
  return System.currentTimeMillis()-time;
}

, где

encryptor = new PooledPBEStringEncryptor();

encryptor.setPoolSize(4);

Я запускаюодин и тот же тест на Ubuntu и на Solaris.Для завершения этого же теста в Solaris требуется больше времени.

Для Solaris в качестве поставщиков безопасности я использовал

sun.security.pkcs11.SunPKCS11 ${java.home}/lib/security/sunpkcs11-solaris.cfg 

или

com.oracle.security.ucrypto.UcryptoProvider ${java.home}/lib/security/ucrypto-solaris.cfg

Для первого поставщика мойтемы остаются здесь:

"Thread-86" #104 prio=5 os_prio=64 tid=0x00000000014ab800 nid=0x78 runnable [0xffff80ffb3971000]
java.lang.Thread.State: RUNNABLE
at sun.security.pkcs11.wrapper.PKCS11.C_CloseSession(Native Method)
at sun.security.pkcs11.SessionRef.dispose(Session.java:171)
at sun.security.pkcs11.Session.close(Session.java:120)
at sun.security.pkcs11.SessionManager.closeSession(SessionManager.java:232)
at sun.security.pkcs11.SessionManager.killSession(SessionManager.java:174)
at sun.security.pkcs11.Token.killSession(Token.java:311)
at sun.security.pkcs11.P11Digest.engineReset(P11Digest.java:144)
at sun.security.pkcs11.P11Digest.engineDigest(P11Digest.java:194)
at sun.security.pkcs11.P11Digest.engineDigest(P11Digest.java:157)
at java.security.MessageDigest$Delegate.engineDigest(MessageDigest.java:592)
at java.security.MessageDigest.digest(MessageDigest.java:365)
at com.sun.crypto.provider.PBES1Core.deriveCipherKey(PBES1Core.java:279)
at com.sun.crypto.provider.PBES1Core.init(PBES1Core.java:250)
at com.sun.crypto.provider.PBEWithMD5AndDESCipher.engineInit(PBEWithMD5AndDESCipher.java:221)

В то время как для другого здесь:

Thread-73" #91 prio=5 os_prio=64 tid=0x0000000001733800 nid=0x6b runnable [0xffff80ffb467e000]
java.lang.Thread.State: RUNNABLE
at com.oracle.security.ucrypto.NativeDigest.nativeInit(Native Method)
at com.oracle.security.ucrypto.NativeDigest.engineUpdate(NativeDigest.java:167)
- locked <0x00000003402108d0> (a com.oracle.security.ucrypto.NativeDigest$MD5)
at java.security.MessageDigest$Delegate.engineUpdate(MessageDigest.java:584)
at java.security.MessageDigest.update(MessageDigest.java:335)
at com.sun.crypto.provider.PBES1Core.deriveCipherKey(PBES1Core.java:278)
at com.sun.crypto.provider.PBES1Core.init(PBES1Core.java:250)
at com.sun.crypto.provider.PBEWithMD5AndDESCipher.engineInit(PBEWithMD5AndDESCipher.java:221)
at javax.crypto.Cipher.init(Cipher.java:1393)
at javax.crypto.Cipher.init(Cipher.java:1326)

Не могли бы вы дать совет, как мне следует устранить эту проблему.Существуют ли какие-либо известные проблемы для запуска jasypt в Solaris?

Мой тест состоит в создании массива с несколькими простыми строками, зашифрованными с помощью jasypt (в нем 30 элементов), и последующем запуске 100 потоков.Каждый поток расшифровывает элементы в массиве 10 раз.

Результаты в Solaris: потоку требуется от 39 до 79 секунд для выполнения этой задачи

Результаты в Linux: потоку требуется от 2 до 7секунд для выполнения этой задачи

На машине с Linux: 1 физический процессор, 8 ядер

В Solaris у меня есть виртуальная машина, которая находится на машине с 2 физическими процессорами, каждый из которых имеет 4 ядра и 8 виртуальных процессоров..

Примечание: мы испытывали медлительность при расшифровке данных даже на Solaris Sparc с 256 ядрами.Я не смог выполнить свои тесты в этой среде.

public static ArrayList<String> ar = new ArrayList();
public static PooledPBEStringEncryptor encryptor;
static
{
    Provider[] providers = Security.getProviders();
    encryptor = new PooledPBEStringEncryptor();
    encryptor.setPoolSize(4);
    encryptor.setPassword("xxxxxx");

    for (int i=0;i<10;i++){
        ar.add(encryptJasyptValue("false"));
    }
    for (int i=0;i<10;i++){
        ar.add(encryptJasyptValue(""+i));
    }
    for (int i=0;i<10;i++){
        ar.add(encryptJasyptValue("true"));
    }


}


public static long encryptJasypt (String str){
long time = System.currentTimeMillis();
return System.currentTimeMillis()-time;
}

public static long decryptJasypt (String str){
    long time = System.currentTimeMillis();
    encryptor.decrypt(str);
    return System.currentTimeMillis()-time;
}

public static void main(String[] args) throws Exception
{


    int noTreads =100;
    if(args.length>0 && args[0]!=null) {
         noTreads = Integer.parseInt(args[0]);
    }
    for (int i=0;i<noTreads;i++)
    {
       new MyThread().start();
    }


 }
}

class MyThread extends Thread {
public void run() {

    long time=0;
    for (int k=0;k<10;k++) {
        for (int i = 0; i < CryptoUtil.ar.size(); i++) {
            time += CryptoUtil.decryptJasypt(CryptoUtil.ar.get(i));
        }
    }
    System.out.println("took d="+time);
}

}
...