Я использую 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);
}
}